计算非 NA 值并按变量分组

count non-NA values and group by variable

我正在尝试使用 complete.cases 包或任何其他包来显示每个变量 ID 没有 有多少完整的观察结果。

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

最后,我想要一个包含两列的频率 table: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

其中一种方法是使用 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")

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

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

您可以直接使用 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

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