我正在努力将数据框聚合成我想要的格式。数据框包含一系列部件,以及执行的测试列表(长度和宽度),以及每次测量的下限和上限(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
非常感谢任何帮助!
答案 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(这更准确地反映了限制的含义)。在这种情况下,聚合就像我期待的那样。