我希望通过小组检测并总结缺失的观察结果。我试图使用aggregate
,但无法使用它。下面是一个示例数据集和所需的结果。
my.data = read.table(text = "
GROUP Z
1 NA
1 NA
1 NA
2 A
2 NA
2 NA
2 A
3 A
3 A
3 NA
", header = TRUE, stringsAsFactors = FALSE, na.strings = "NA")
my.data
desired.result <- read.table(text = "
GROUP Z my.na my.sum
1 <NA> TRUE 3
1 <NA> TRUE 3
1 <NA> TRUE 3
2 A TRUE 2
2 <NA> TRUE 2
2 <NA> TRUE 2
2 A TRUE 2
3 A TRUE 1
3 A TRUE 1
3 <NA> TRUE 1
", header = TRUE, stringsAsFactors = FALSE, na.strings = "NA")
以下是我使用的代码:
my.na <- aggregate(my.data$Z ~ my.data$GROUP, FUN = function(x) any(is.na(x)))
colnames(my.na) <- c('GROUP', 'my.na')
my.sum <- aggregate(my.data$Z ~ my.data$GROUP, FUN = function(x) sum(is.na(x)))
colnames(my.sum) <- c('GROUP', 'my.sum')
my.data2 <- merge(my.data , my.na , by=c('GROUP'), all=TRUE)
my.data2 <- merge(my.data2, my.sum, by=c('GROUP'), all=TRUE)
my.data2
上述功能在aggregate
之外工作,如下所示:
x <- c(NA, 1, 3, NA, NA)
sum(is.na(x))
# [1] 3
any(is.na(x))
# [1] TRUE
感谢您的任何建议。
答案 0 :(得分:0)
正如我准备按下提交按钮,我想尝试:
with(my.data, aggregate(Z, by = list(GROUP), FUN = function(x) any(is.na(x)) ))
with(my.data, aggregate(Z, by = list(GROUP), FUN = function(x) sum(is.na(x)) ))
这很有效。虽然,我不知道为什么list
方法有效,而~
方法却没有。
答案 1 :(得分:0)
require(data.table)
my.data = data.table(my.data)
my.data[,list(Z,my.na = any(is.na(Z)), my.sum = sum(is.na(Z))),by="GROUP"]