使用聚合检测和求和NA

时间:2014-09-24 17:58:16

标签: r aggregate

我希望通过小组检测并总结缺失的观察结果。我试图使用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

感谢您的任何建议。

2 个答案:

答案 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"]

enter image description here