我正在尝试使用ID
包或任何其他包来显示每个变量complete.cases
没有的完整观察数量。
如果我使用na.omit
过滤掉NA值,我将丢失所有可能包含ZERO完整案例的ID。
最后,我想要一个包含两列的频率表:ID
和Number 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
答案 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值相加。希望这很容易理解和帮助。