计算非 NA 值并按变量分组
count non-NA values and group by variable
我正在尝试使用 complete.cases
包或任何其他包来显示每个变量 ID
没有 有多少完整的观察结果。
如果我使用 na.omit
过滤掉 NA 值,我将丢失所有可能具有零个完整案例的 ID。
最后,我想要一个包含两列的频率 table: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
其中一种方法是使用 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 值求和。希望这很容易理解并有所帮助。
我正在尝试使用 complete.cases
包或任何其他包来显示每个变量 ID
没有 有多少完整的观察结果。
如果我使用 na.omit
过滤掉 NA 值,我将丢失所有可能具有零个完整案例的 ID。
最后,我想要一个包含两列的频率 table: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
其中一种方法是使用 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 值求和。希望这很容易理解并有所帮助。