gpt4 book ai didi

r - 如何获得聚合函数中的所有总和?

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

以下是一些示例数据:

dat="x1 x2 x3 x4 x5
1 C 1 16 NA 16
2 A 1 16 16 NA
3 A 1 16 16 NA
4 A 4 64 64 NA
5 C 4 64 NA 64
6 A 1 16 16 NA
7 A 1 16 16 NA
8 A 1 16 16 NA
9 B 4 64 32 32
10 A 3 48 48 NA
11 B 4 64 32 32
12 B 3 48 32 16"

data<-read.table(text=dat,header=TRUE)
aggregate(cbind(x2,x3,x4,x5)~x1, FUN=sum, data=data)
x1 x2 x3 x4 x5
1 B 11 176 96 8

我如何获得 A 的总和和 C以及 x1 ?
 aggregate(.~x1, FUN=sum, data=data, na.action = na.omit)  
x1 x2 x3 x4 x5
1 B 11 176 96 80

当我使用 sqldf :
library("sqldf")
sqldf("select sum(x2),sum(x3),sum(x4),sum(x5) from data group by x1")
sum(x2) sum(x3) sum(x4) sum(x5)
1 12 192 192 <NA>
2 11 176 96 80
3 5 80 NA 80

为什么我会收到 <NA>在第一行,但是 NA在第三行?
它们之间有什么区别?为什么我会收到 <NA> ?没有 <NA>在数据!
str(data)
'data.frame': 12 obs. of 5 variables:
$ x1: Factor w/ 3 levels "A","B","C": 3 1 1 1 3 1 1 1 2 1 ...
$ x2: int 1 1 1 4 4 1 1 1 4 3 ...
$ x3: int 16 16 16 64 64 16 16 16 64 48 ...
$ x4: int NA 16 16 64 NA 16 16 16 32 48 ...
$ x5: int 16 NA NA NA 64 NA NA NA 32 NA ...

sqldf问题依然存在,为什么 sum(x4)获取 NA ,相反 sum(x5)获取 <NA> ?

我可以证明所有 NA在 x4 和 x5 中都是这样的:
data[is.na(data)] <- 0     

> data
x1 x2 x3 x4 x5
1 C 1 16 0 16
2 A 1 16 16 0
3 A 1 16 16 0
4 A 4 64 64 0
5 C 4 64 0 64
6 A 1 16 16 0
7 A 1 16 16 0
8 A 1 16 16 0
9 B 4 64 32 32
10 A 3 48 48 0
11 B 4 64 32 32
12 B 3 48 32 16

所以 sqldf 处理 sum(x4) 的事实和 sum(x5)不同的是太奇怪了,我认为 sqldf 中存在逻辑困惑。可以在其他电脑上复制。请先做,然后继续讨论。

最佳答案

因为aggregate的公式方法如何 Handlebars NA默认情况下,您需要在使用 na.rm 之前覆盖它来自 sum 的争论.您可以通过设置 na.action 来做到这一点。至 NULLna.pass :

aggregate(cbind(x2,x3,x4,x5) ~ x1, FUN = sum, data = data, 
na.rm = TRUE, na.action = NULL)
# x1 x2 x3 x4 x5
# 1 A 12 192 192 0
# 2 B 11 176 96 80
# 3 C 5 80 0 80

aggregate(cbind(x2,x3,x4,x5) ~ x1, FUN = sum, data = data,
na.rm = TRUE, na.action = na.pass)
# x1 x2 x3 x4 x5
# 1 A 12 192 192 0
# 2 B 11 176 96 80
# 3 C 5 80 0 80

关于 sqldf ,似乎列被转换为不同的类型,具体取决于 第一个分组变量的第一行中的项目是 NA或不。如果是 NA ,该列被转换为 character .

相比:
df1 <- data.frame(id = c(1, 1, 2, 2, 2),
A = c(1, 1, NA, NA, NA),
B = c(NA, NA, 1, 1, 1))
sqldf("select sum(A), sum(B) from df1 group by id")
# sum(A) sum(B)
# 1 2 <NA>
# 2 NA 3.0

df2 <- data.frame(id = c(2, 2, 1, 1, 1),
A = c(1, 1, NA, NA, NA),
B = c(NA, NA, 1, 1, 1))
sqldf("select sum(A), sum(B) from df2 group by id")
# sum(A) sum(B)
# 1 <NA> 3
# 2 2.0 NA

但是,有一个简单的解决方法:将原始名称重新分配给正在创建的新列。也许让我们 SQLite 从以前的数据库中继承一些信息? (我真的不使用 SQL。)

示例(使用之前创建的相同“df2”):
sqldf("select sum(A) `A`, sum(B) `B` from df2 group by id")
# A B
# 1 NA 3
# 2 2 NA

您可以轻松使用 paste创建您的 select陈述:
Aggs <- paste("sum(", names(data)[-1], ") `", 
names(data)[-1], "`", sep = "", collapse = ", ")
sqldf(paste("select", Aggs, "from data group by x1"))
# x2 x3 x4 x5
# 1 12 192 192 NA
# 2 11 176 96 80
# 3 5 80 NA 80
str(.Last.value)
# 'data.frame': 3 obs. of 4 variables:
# $ x2: int 12 11 5
# $ x3: int 192 176 80
# $ x4: int 192 96 NA
# $ x5: int NA 80 80

如果需要,可以采用类似的方法 NA替换为 0 :
Aggs <- paste("sum(ifnull(", names(data)[-1], ", 0)) `", 
names(data)[-1], "`", sep = "", collapse = ", ")
sqldf(paste("select", Aggs, "from data group by x1"))
# x2 x3 x4 x5
# 1 12 192 192 0
# 2 11 176 96 80
# 3 5 80 0 80

关于r - 如何获得聚合函数中的所有总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20838598/

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