R 骨料使用;“因素”;那是安娜

R 骨料使用;“因素”;那是安娜,r,aggregate,na,R,Aggregate,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

我正在努力将数据帧聚合为我想要的格式。数据框包含一系列部分,以及执行的测试列表(长度和宽度),以及每个测量的下限和上限(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
4    L  20  NA    1

任何帮助都将不胜感激

根据Jimbou的建议,以下工作(但感觉有点凌乱):


df
dplyr
很好地处理了这个问题:

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

包{dplyr}可以与函数
groupby()
summary()
一起使用:


df您可以使用df[is.NA(df)]将NA转换为字符@Jimbou这可能会更改列的类别。@nicola
聚合
函数在使用前强制
by
元素为因子。所以这不重要。@Jimbou我不是说结果,而是说原始的
data.frame
。按您的方式设置
NA
将修改某些列。@nicola是的,您完全正确。备份
df
或仅转换目标列
df$UL[is.na(df$UL)]
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)
   library(dplyr)
   df %>% group_by(Test,LL,UL)  %>% summarise( n() )
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