计算非NA值并按变量

时间:2016-07-20 12:25:57

标签: r count aggregate na

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

如果我使用na.omit过滤掉NA值,我将丢失所有可能包含ZERO完整案例的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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您可以直接使用表格来达到此目的。以下是示例代码:

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值相加。希望这很容易理解和帮助。