Агрегировать с использованием "факторов", которые являются NA

Я изо всех сил пытаюсь объединить фрейм данных в формат, который я хочу. Фрейм данных содержит ряд частей, а также список выполненных тестов (длина и ширина), а также нижний и верхний пределы (LL и UL) для каждого измерения. Некоторые из тестов не имеют одного или другого ограничения. Я пытаюсь подсчитать, сколько деталей имеют заданную комбинацию "test-LL-UL", включая эти тесты с NA в качестве одного из ограничений.

То, что я пробовал до сих пор, это следующее:

df<-read.table(header = TRUE, text = "
Part Test   LL  UL
A    L      20  40
A    W      5   7
B    L      20  NA
B    W      5   7
C    L      20  40
C    W      10  30
")
aggregate(data=df,Part~Test+LL+UL,FUN=length,na.action=na.pass)

Это дает следующий вывод:

  Test  LL  UL Part
1    W   5   7    2
2    W  10  30    1
3    L  20  40    2

То, что я ожидал получить, было:

  Test  LL  UL Part
1    W   5   7    2
2    W  10  30    1
3    L  20  40    2
4    L  20  NA    1

Любая помощь будет принята с благодарностью!

3 ответа

dplyr справляется с этим довольно красиво:

   library(dplyr)
   df %>% group_by(Test,LL,UL)  %>% summarise( n() )

Пакет {dplyr} может быть использован с функциями group_by() а также summarize():

df <- data.frame(Part = c("A","A","B","B","C","C"), 
                 Test = c("L","W","L","W","L","W"),
                 LL = c(20,5,20,5,20,10),
                 UL = c(40,7,NA,7,40,30))

grouped <- dplyr::group_by(df, Test, LL, UL)
summarize(grouped, count = n())

##     Test    LL    UL count
##  (fctr) (dbl) (dbl) (int)
##1      L    20    40     2
##2      L    20    NA     1
##3      W     5     7     2
##4      W    10    30     1

В соответствии с предложением Jimbou, следующие работы (но чувствуют себя немного грязно):

df<-read.table(header = TRUE, text = "
               Part Test   LL  UL
               A    L      20  40
               A    W      5   7
               B    L      20  NA
               B    W      5   7
               C    L      20  40
               C    W      10  30
               ")
df[is.na(df)] <- "NA"
df<-aggregate(data=df,Part~Test+LL+UL,FUN=length,na.action=na.pass)
df$UL<-as.numeric(df$UL)

Я думаю, что для этого нужно установить для верхних пределов значение Inf, а для нижних пределов значение -Inf (это более точно отражает значение пределов). В этом случае агрегат работает так, как я ожидал.

Другие вопросы по тегам