使用NA

时间:2016-02-23 15:47:22

标签: 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      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 个答案:

答案 0 :(得分:2)

dplyr处理得非常好:

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

答案 1 :(得分:1)

Package {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

答案 2 :(得分:0)

根据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(这更准确地反映了限制的含义)。在这种情况下,聚合就像我期待的那样。