计算每组完整案例数

时间:2015-01-14 13:11:18

标签: r function count complete

我有一个大数据集(大约10 000行),并且想要创建一个函数来计算每个组的完整案例数(不是NA)。我尝试了各种函数(聚合,表,sum(complete.cases),group_by等),但不知怎的,我想念一个 - 可能是小技巧。谢谢你的帮助!

一些小样本数据集来解释,我需要的结果。

x <- data.frame(group = c(1:4), 
                age = c(4:1, c(11, NA,13, NA)), 
                speed = c(12, NA,15,NA))
print(x)
#  group age speed
#1     1   4    12
#2     2   3    NA
#3     3   2    15
#4     4   1    NA
#5     1  11    12
#6     2  NA    NA
#7     3  13    15
#8     4  NA    NA

我写的一个函数如下:

CountPerGroup <- function(group) {
    data.set <- subset(x,group %in% group)

    vect <- vector()
    for (i in 1:length(group)) {
        vect[i] <- sum(complete.cases(data.set))
    }
    output <- data.frame(cbind(group,count=vect))   
    return(output)

}

的结果
CountPerGroup(2:1)

  group count
1     2     4
2     1     4

不幸的是,这是错误的。相反,结果应该看起来像

  group count
1     2     1
2     1     4

我错过了什么?如何判断R是否计算完成每组? 非常感谢您对此的任何帮助!

4 个答案:

答案 0 :(得分:3)

如果您希望保持自己的功能,应该采取行动:

x <- data.frame(group = c(1:4), 
                age = c(4:1, c(11, NA,13, NA)), 
                speed = c(12, NA,15,NA))

CountPerGroup <- function(x, groups) {
  data.set <- subset(x, group %in% groups)
  ans <- sapply(split(data.set, data.set$group), 
                function(y) sum(complete.cases(y)))
  return(data.frame(group = names(ans), count = unname(ans)))
}


CountPerGroup(x, 1:2)
#  group count
#1     1     2
#2     2     0

根据我的计算,这是正确的。但它不符合您的建议结果。

修改

您似乎想要非NA的数量而是正确排序。请改用此功能:

CountPerGroup2 <- function(x, groups) {
   data.set <- subset(x, group %in% groups)
   ans <- sapply(split(data.set, data.set$group), 
                 function(y) sum(!is.na(y[, !grepl("group", names(y))])))[groups]
   return(data.frame(group = names(ans), count = unname(ans)))
}

CountPerGroup2(x, 2:1)
#  group count
#1     2     1
#2     1     4

答案 1 :(得分:1)

如果您只想找到一种方法来获得每组的非NA值的完整计数,您可以使用以下内容:

library(plyr)
x <- data.frame(group = c(1:4), 
                age = c(4:1, c(11, NA,13, NA)), 
                speed = c(12, NA,15,NA))

counts <- ddply(x, "group", summarize, count=sum(!is.na(c(age, speed))))

##   group count
## 1     1     4
## 2     2     1
## 3     3     4
## 4     4     1

您确实错过了使用功能来查询组的子集,但您可以通过单行方式计算完整解决方案。

答案 2 :(得分:0)

以下是data.table

的方法
library(data.table)
library(functional)

countPerGroup = function(x, vec)
{
    dt = data.table(x) 
    d1 = setkey(dt, group)[group %in% vec]
    d2 = d1[,lapply(.SD, Compose(Negate(is.na), sum)),by=group]
    transform(d2, count=age+speed, speed=NULL, age=NULL)
}


countPerGroup(x, 1:2)
#   group count
#1:     1     4
#2:     2     1

countPerGroup(x, c(1,2))
#   group count
#1:     1     4
#2:     2     1

如果data.table中有大量的行,则效果非常好!

答案 3 :(得分:0)

我只是遇到了同样的问题,并且找到了更简单的解决方案

库(数据表)

x <- data.table(group = c(1:4), 
                age = c(4:1, c(11, NA,13, NA)), 
                speed = c(12, NA,15,NA))
x[,sum(complete.cases(.SD)), by=group]