我想聚合一个超过 3 个类别的 data.frame,其中一个是不同的。不幸的是,这个不同的类别包含 NA(实际上这就是它需要变化的原因)。因此,我创建了一个data.frames
. 此列表中的每个 data.frame 仅包含关于三个变量的完整案例(其中只有一个变量发生变化)。
让我们重现这个:
library(plyr)
mydata <- warpbreaks
names(mydata) <- c("someValue","group","size")
mydata$category <- c(1,2,3)
mydata$categoryA <- c("A","A","X","X","Z","Z")
# add some NA
mydata$category[c(8,10,19)] <- NA
mydata$categoryA[c(14,1,20)] <- NA
# create a list of dfs that contains TRUE FALSE
noNAList <- function(vec){
res <- !is.na(vec)
return(res)
}
testTF <- lapply(mydata[,c("category","categoryA")],noNAList)
# create a list of data.frames
selectDF <- function(TFvec){
res <- mydata[TFvec,]
return(res)
}
# check x and see that it may contain NAs as long
# as it's not in one of the 3 categories I want to aggregate over
x <-lapply(testTF,selectDF)
## let's ddply get to work
doddply <- function(df){
ddply(df,.(group,size),summarize,sumTest = sum(someValue))
}
y <- lapply(x, doddply);y
y
非常接近我想要得到的
$category
group size sumTest
1 A L 375
2 A M 198
3 A H 185
4 B L 254
5 B M 259
6 B H 169
$categoryA
group size sumTest
1 A L 375
2 A M 204
3 A H 200
4 B L 254
5 B M 259
6 B H 169
但是我需要在第三个变量上实现聚合,在这种情况下是category
和categoryA
. 就像:
group size category sumTest sumTestTotal
1 A H 1 46 221
2 A H 2 46 221
3 A H 3 93 221
等等。如何将名称(x)添加到 lapply,或者我需要一个循环或环境?
编辑:请注意,我希望将类别或类别 A 添加到组合中。实际上,我有大约 15 个互斥的分类变量。