【问题标题】:count non-NA values and group by variable计算非 NA 值并按变量分组
【发布时间】:2016-07-20 12:25:57
【问题描述】:

我试图使用complete.cases 包或任何其他包显示每个变量ID 没有 有多少完整观察。

如果我使用na.omit 过滤掉 NA 值,我将丢失所有可能包含零个完整案例的 ID。

最后,我想要一个包含两列的频率表:IDNumber of Complete Observations

> length(unique(data$ID))
[1] 332

> head(data)
  ID value
1  1   NA
2  1   NA
3  1   NA
4  1   NA
5  1   NA
6  1   NA

> dim(data)
[1] 772087      2

当我尝试创建自己的函数 z - 计算非 NA 值并将其应用于 aggregate() 函数时,完整观察值为零的 ID 将被忽略。我应该留下 332 行,而不是 323 行。如何使用基本函数解决这个问题?

z <- function(x){
  sum(!is.na(x))
}

aggregate(value ~ ID, data = data , FUN = "z")

> nrow(aggregate(isna ~ ID, data = data , FUN = "z"))
[1] 323

【问题讨论】:

  • 你能 dput() 你的数据吗?
  • 不是一个好的解决方案,但您可以将所有 NA 值设置为等于 value 变量中不存在的数字(例如 0 或 9999999)。计算行中没有该数字的观察数。然后将所有这些数字设置回 NA。
  • complete.cases 是一个函数而不是一个包
  • 参见aggregate 的“na.action”参数——“na.action = NULL”。或者,对于这种情况,您可以使用 tabletable(!is.na(data$value), data$ID)

标签: r count aggregate na


【解决方案1】:

其中一种方法是使用table

df2 <- table(df$Id, !is.na(df$value))[,2]
data.frame(ID = names(df2), value = df2)

数据

structure(list(Id = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4), value = c(NA, 
1, 1, 2, 2, NA, 3, NA, 3, 3, 4, 4)), .Names = c("Id", "value"
), row.names = c(NA, -12L), class = "data.frame")

【讨论】:

    【解决方案2】:

    Base R 你可以像这样使用你的实用函数:

    stack(by(data$value, data$ID, FUN=function(x) sum(!is.na(x))))
    

    【讨论】:

      【解决方案3】:

      您可以直接使用 table 来实现此目的。下面是示例代码:

      df1 <- structure(list(Id = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4), value = c(2, 
      1, 1, NA, NA, NA, 3, NA, 3, 3, 4, 4)), .Names = c("Id", "value"
      ), row.names = c(NA, -12L), class = "data.frame")
      
      
      df2 <- as.data.frame.matrix(with(df1, table(Id, value)))
      resultDf <- data.frame(Id=row.names(df2), count=apply(df2, 1, sum)) 
      resultDf
      

      代码制作了一个 id 和 value 的表。然后它只是对表中的非 na 值求和。希望这很容易理解并有所帮助。

      【讨论】:

        猜你喜欢
        • 2017-06-10
        • 1970-01-01
        • 2017-11-01
        • 2019-11-19
        • 1970-01-01
        • 2018-01-14
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        相关资源
        最近更新 更多