Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 计数非NA值并按变量分组_R_Count_Aggregate_Na - Fatal编程技术网

R 计数非NA值并按变量分组

R 计数非NA值并按变量分组,r,count,aggregate,na,R,Count,Aggregate,Na,我试图在不使用complete.cases包或任何其他包的情况下,显示每个变量ID有多少完整的观察结果 如果我使用na.ommit过滤掉na值,我将丢失所有可能没有完整案例的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

我试图在不使用
complete.cases
包或任何其他包的情况下,显示每个变量
ID
有多少完整的观察结果

如果我使用
na.ommit
过滤掉na值,我将丢失所有可能没有完整案例的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
z nrow(聚合(isna~ID,data=data,FUN=“z”))
[1] 323

执行此操作的方法之一是使用

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

其中一种方法是使用

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

Base
R
您可以像这样使用实用程序功能:

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

Base
R
您可以像这样使用实用程序功能:

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

为此,您可以直接使用表。下面是示例代码:

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

df1为此,您可以直接使用表。下面是示例代码:

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

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