Агрегировать с использованием "факторов", которые являются 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 (это более точно отражает значение пределов). В этом случае агрегат работает так, как я ожидал.