gpt4 book ai didi

r - 使用 ddply 和 lapply 聚合包含 NA 的类别?

转载 作者:行者123 更新时间:2023-12-04 11:56:56 25 4
gpt4 key购买 nike

我想汇总 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

但我需要在第三个变量上实现聚合,在本例中是 categorycategoryA。就像:

group size category sumTest sumTestTotal      
1 A H 1 46 221
2 A H 2 46 221
3 A H 3 93 221

等等。如何将 names(x) 添加到 lapply,或者我需要一个循环或环境?

编辑:请注意,我希望将类别或类别 A 添加到组合中。实际上,我有大约 15 个互斥的分类变量。

最佳答案

如果我正确理解你的问题,我认为你可能会让自己很难受。

如果您想通过三个(或四个)变量聚合 data.frame 'myData',您只需这样做:

aggregate(someValue ~ group + size + category + categoryA, sum, data=mydata)

group size category categoryA someValue
1 A L 1 A 51
2 B L 1 A 19
3 A M 1 A 17
4 B M 1 A 63

aggregate 将自动删除任何类别中包含 NA 的行。如果 someValue 有时为 NA,那么您可以添加参数 na.rm=T。

我还注意到您在函数中添加了很多不必要的代码。例如:

# create a list of data.frames
selectDF <- function(TFvec){
res <- mydata[TFvec,]
return(res)
}

可以写成:

selectDF <- function(TFvec) mydata[TFvec,] 

另外,使用 lapply 创建一个没有 NA 的两个数据帧的列表是多余的。试试这个代码:

x = list(mydata[!is.na(mydata$category),],mydata[!is.na(mydata$categoryA),])

关于r - 使用 ddply 和 lapply 聚合包含 NA 的类别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8913621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com