计算每组的完整个案
Count Complete Cases per Group
我有一个大数据集(大约 10 000 行),并且想创建一个函数来计算每组完整案例(不是 NA)的数量。我尝试了各种函数(聚合、table、求和(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 计算每个组 complete.cases ?
非常感谢您对此的任何帮助!
如果您希望保持您的功能,类似的东西应该可以解决问题:
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
这里有一个方法 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
中有很多行,它特别有效!
如果您只是想寻找一种方法来获取每组非 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
您确实错过了一个 函数 让您可以查询组的子集,但是您得到了一种计算完整解决方案的单行方法。
我刚刚遇到了同样的问题并找到了更简单的解决方案
图书馆(data.table)
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]
我有一个大数据集(大约 10 000 行),并且想创建一个函数来计算每组完整案例(不是 NA)的数量。我尝试了各种函数(聚合、table、求和(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 计算每个组 complete.cases ? 非常感谢您对此的任何帮助!
如果您希望保持您的功能,类似的东西应该可以解决问题:
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
这里有一个方法 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
中有很多行,它特别有效!
如果您只是想寻找一种方法来获取每组非 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
您确实错过了一个 函数 让您可以查询组的子集,但是您得到了一种计算完整解决方案的单行方法。
我刚刚遇到了同样的问题并找到了更简单的解决方案
图书馆(data.table)
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]