这里是一些示例数据:
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
我该如何在
x1
中同时得到A
和C
的总和? 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>
?我可以证明x4和x5中所有的
NA
都是相同的: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存在逻辑混乱。它可以在其他计算机上重现。请先进行测试,然后进行讨论。
<NA>
来区分真正的NA
值和字符表示的NA
,例如"NA"
。如果你查看运行该命令后的返回值,你会得到一个data.frame
,其中前三列是integer
类型,第四列是character
类型。我猜sqldf
在某个地方将第四列转换为了因子。尝试使用str(sqldf("select sum(x2),sum(x3),sum(x4),sum(x5) from data group by x1"))
查看我的意思。 - Simon O'Hanlontotal
代替sum
,这种情况下零行将总计为0而不是NULL,因此问题不会发生,(3)使用sqldf的method
参数指定类别,(4)使用sqldf支持的其他数据库之一(H2、MySQL、PostgreSQL)而不是SQLite。有关更多信息,请参见?sqldf
和http://sqldf.googlecode.com。 - G. Grothendieck