我觉得我以前做过这个,但不知道为什么我突然想不通了。我只是尝试使用 aggregate() 函数聚合数据,而不删除分组项为 NA 的任何行。我也不想担心将 NA 转换为字符串之类的东西......鉴于以下情况:
FOO_BAR <- data.frame(Foo=c(rep("omg", 6), rep(NA, 6), rep("omg", 6), rep(NA, 6)),
Bar=c(rep("This", 6), rep("is", 6), rep("so", 6), rep("annoying", 6)),
Doh=rnorm(24))
我想使用以下内容:
aggregate(data=FOO_BAR, Doh ~ ., FUN=sum, na.action=na.pass, na.rm=FALSE)
要产生这样的东西:
福 | 酒吧 | 多哈 |
---|---|---|
天啊 | 这个 | ### |
NA | 是 | ### |
天啊 | 所以 | ### |
NA | 烦人 | ### |
我试过 na.action=na.pass 和 na.action=NULL。我试过玩弄变量“Foo”的类。我想使用 aggregate() 来解决它,而不是其他方法,例如 summarize()。任何帮助表示赞赏。
您的问题不在于
aggregate
,而是factor
的默认行为,它不包括NA
:
FOO_BAR$Foo <- factor(FOO_BAR$Foo, exclude = NULL)
aggregate(data=FOO_BAR, Doh ~ ., FUN=sum)
# OR
FOO_BAR$Foo <- addNA(FOO_BAR$Foo)
aggregate(data=FOO_BAR, Doh ~ ., FUN=sum)
aggregate
强迫你的群体到因素。 ?factor
显示默认为exclude = NA
。如果 FOO_BAR$Bar
也有 NA
你需要做同样的事情来包含它。
输出
可以看出
Bar
已经转换为一个因数。默认情况下,因子按字母顺序排列,这就是为什么annoying
排在第一位而This
排在最后的原因,所以不幸的是Bar
没有按照您的预期阅读:)
Foo Bar Doh
1 <NA> annoying -1.520229
2 <NA> is -1.690467
3 omg so 2.588006
4 omg This -4.424476
当然,我们可以修复此行为——我们不希望您的消息丢失。我们可以使用
level
:,而不是手动设置
factor
的
forcast::fct_inorder
参数
FOO_BAR$Bar <- forcats::fct_inorder(FOO_BAR$Bar)
aggregate(data=FOO_BAR, Doh ~ ., FUN=sum)
Foo Bar Doh
1 omg This -4.424476
2 <NA> is -1.690467
3 omg so 2.588006
4 <NA> annoying -1.520229
或者你可以简单地做:
library(dplyr)
FOO_BAR |>
summarize(Doh = sum(Doh),
.by = c(Foo, Bar))
你可以试试
data.table
如下
> library(data.table)
> setDT(FOO_BAR)[, .(Doh = sum(Doh)), .(Foo, Bar)]
Foo Bar Doh
1: omg This 2.101502
2: <NA> is 4.557829
3: omg so -1.996853
4: <NA> annoying -1.988226