R:在一列中的Sum Complete.cases由另一列中的值分组(或排序)

时间:2014-05-13 14:47:52

标签: r sorting aggregate

我正在使用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

如您所见,我在列NAOzone中有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 =

3 个答案:

答案 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获得聚合。

  

注意:.Ndata.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之间是否存在一些小混淆?)