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

bsxbgnwa  于 2023-05-04  发布在  其他
关注(0)|答案(2)|浏览(162)

我觉得我以前做过这件事,不知道为什么我突然不弄清楚。我只是尝试使用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)

产生类似这样的结果:
| 富|酒吧|多赫|
| --------------|--------------|--------------|
| OMG|这个|###|
| 不适用|是|###|
| OMG|所以|###|
| 不适用|烦人|###|
我尝试了na.action=na.pass和na.action=NULL。我试过使用变量“Foo”的类。我想使用aggregate()来解决它,而不是另一种方法,如summarize()。任何帮助感激不尽。

uxhixvfz

uxhixvfz1#

您的问题不在于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将您的by组强制转换为factors。?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

当然,我们可以修复这种行为--我们不希望您的消息丢失。我们可以使用forcast::fct_inorder,而不是手动设置factorlevel参数:

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

wnrlj8wa2#

您可以像下面这样尝试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

相关问题