R - aggregate(),使用 na.action 不丢弃数据

问题描述 投票:0回答:2

我觉得我以前做过这个,但不知道为什么我突然想不通了。我只是尝试使用 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()。任何帮助表示赞赏。

r sum aggregate na
2个回答
3
投票

您的问题不在于

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))

2
投票

你可以试试

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
© www.soinside.com 2019 - 2024. All rights reserved.