Я хотел бы объединить data.frame по 3 категориям, одна из которых варьируется.К сожалению, эта одна изменяющаяся категория содержит 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 взаимоисключающих категориальных переменных.