我正在使用R中可用的airquality
数据集,并尝试计算数据中不包含任何NA
的行数,同时按Month
汇总
数据如下所示:
head(airquality)
# Ozone Solar.R Wind Temp Month Day
# 1 41 190 7.4 67 5 1
# 2 36 118 8.0 72 5 2
# 3 12 149 12.6 74 5 3
# 4 18 313 11.5 62 5 4
# 5 NA NA 14.3 56 5 5
# 6 28 NA 14.9 66 5 6
如您所见,我在列NA
和Ozone
中有Solar.R
个。我使用函数complete.cases
如下:
x <- airquality[,1] # for the Ozone
y <- airquality[,2] # for the Solar.R
ok <- complete.cases(x,y)
然后检查:
nrow(airquality)
# [1] 153
sum(!ok)
# [1] 42
sum(ok)
# [1] 111
这很棒。
但是现在,我想将这些数据分开来排序Month
(第5列),这就是我遇到问题的地方 - 尝试aggregate
或{{1} } by column5(sort
)中的值。
我能够让它运行,它不会按Month
排序(我只是想确保我可以运行该函数):
Month
好的......所以要把它整理出来。我试图使用聚合函数的aggregate(x = sum(complete.cases(airquality)), by= list(nrow(airquality)), FUN = sum)
# Group.1 x
# 1 153 111
部分进行排序。我在by
内尝试了column5的许多变体。
airquality
我收到这些错误:
- airquality[,5]
- airquality[,"Month"]
我尝试进一步搜索aggregate(x = sum(complete.cases(airquality)), by= list(airquality[,5]), FUN = sum)
# Error in aggregate.data.frame(as.data.frame(x), ...) :
# arguments must have same length
aggregate(x = sum(complete.cases(airquality)), by=
list(sum(complete.cases(airquality)),airquality[,5]), FUN = sum)
# Error in aggregate.data.frame(as.data.frame(x), ...) :
# arguments must have same length
函数。即在?aggregate(x, ...)
部分......
by - 分组元素列表,每个元素与数据帧x中的变量一样长。这些元素在使用前被强制使用。
我查了by
,但似乎无法看到如何应用它(如果在这种情况下甚至是必要的话)。我也尝试将?factor
放入其中,但没有奏效。
“可能已经有你答案的问题”似乎都没有适用,其中很多都提供了C#和SQL的解决方案。
编辑:预期结果
break =
答案 0 :(得分:4)
我喜欢data.table
这类问题。确实by
分组非常好,直观地确实......
require( data.table )
dt <- data.table( airquality )
dt[ , list( Count = sum( complete.cases( Ozone , Solar.R ) ) ), by = Month ]
# Month Count
#1: 5 24
#2: 6 9
#3: 7 26
#4: 8 23
#5: 9 29
保持在base
R我会......
airquality$ok <- complete.cases( airquality$Ozone , airquality$Solar.R )
aggregate( ok ~ Month , data = airquality , FUN = sum )
# Month ok
#1 5 24
#2 6 9
#3 7 26
#4 8 23
#5 9 29
修改:使用data.table
的@ Simon解决方案的另一种变体:
dt[complete.cases(Ozone, Solar.R), list(count = .N), by=Month]
# Month count
# 1: 5 24
# 2: 6 9
# 3: 7 26
# 4: 8 23
# 5: 9 29
变体是我们首先仅对 no NA
s 的那些进行过滤/子集,然后通过Month
获得聚合。
注意:
.N
是data.table
中的内置变量 - 长度为1的整数向量,它给出了该组中观察的总数。
答案 1 :(得分:4)
作为其他答案的补充,您可以使用dplyr
。
require(dplyr)
airquality %.%
group_by(Month) %.%
summarize(incomplete = sum(!complete.cases(Ozone, Solar.R)),
complete = sum(complete.cases(Ozone, Solar.R)))
# Month incomplete complete
#1 5 7 24
#2 6 21 9
#3 7 5 26
#4 8 8 23
#5 9 1 29
答案 2 :(得分:2)
这似乎是你在寻找的东西:
> foo <- table(airquality[!ok,"Month"])
> data.frame(Month=names(foo),Count=as.vector(foo))
Month Count
1 5 7
2 6 21
3 7 5
4 8 8
5 9 1
(这与您的修改略有不同。ok
和!ok
之间是否存在一些小混淆?)