计算数据帧中每个变量的0`s,1`s,99`s和NA`s

时间:2016-11-17 19:39:54

标签: r dataframe

我的数据框包含118个变量0's1's 99'sNA's。我需要计算每个变量有多少99'sNA's1's0's99是“不适用”,{{1是“否”,0是“是”而1是“无回答”)。我尝试使用NA函数执行此操作,但它适用于向量,如何为所有变量集执行此操作?

数据框有一个可重复的例子:

table

我需要在数据框中写入变量的结果,如下所示:

forest<-c(1,1,1,1,0,0,0,1,1,1,0,NA,0,NA,0,99,99,1,0,NA)
water<-c(1,NA,NA,NA,NA,99,99,0,0,0,1,1,1,0,0,NA,NA,99,1,0)
rain<-c(1,NA,1,0,1,99,99,0,1,0,1,0,1,0,0,NA,99,99,1,1)
fire<-c(1,0,0,0,1,99,99,NA,NA,NA,1,0,1,0,0,NA,99,99,1,1)

df<-data.frame(forest,water,rain,fire)

5 个答案:

答案 0 :(得分:2)

rbind(sapply(df,table),"NA"=sapply(df, function(y) sum(is.na(y))))
   forest water rain fire
0       7     6    6    6
1       8     5    8    6
99      2     3    4    4
NA      3     6    2    4

答案 1 :(得分:2)

找不到好的傻瓜,所以我的评论作为答案:

数据框实际上是列的列表。 .countup-text将一个函数应用于输入中的每个项目(如果是数据框,则为每一列),并返回包含每个结果的列表:

lapply

lapply(df, table) # $forest # # 0 1 99 # 7 8 2 # # $water # # 0 1 99 # 6 5 3 # # $rain # # 0 1 99 # 6 8 4 # # $fire # # 0 1 99 # 6 6 4 sapply类似,但会尝试 s 表示结果,而不是始终返回lapply。在这两种情况下,您都可以将其他参数传递给正在应用的函数,例如listuseNA = "always",以便在输出中包含table

NA

对于 lot 更多信息,请查看R Grouping functions: sapply vs. lapply vs. apply. vs. tapply vs. by vs. aggregate

要与其他答案进行比较:sapply(df, table, useNA = "always") # forest water rain fire # 0 7 6 6 6 # 1 8 5 8 6 # 99 2 3 4 4 # <NA> 3 6 2 4 applylapply类似,但它适用于矩阵或更高维数组。您应该在 sapply 上使用apply的唯一时间是您需要将函数应用于每一行。对于数据框列上的函数,请更喜欢data.framelapply。原因是sapply会先将数据框强制转换为apply,如果您有不同类的列,则会产生意外后果。

答案 2 :(得分:1)

这应该这样做:

tables <- apply(df, 2, FUN = table)

答案 3 :(得分:1)

可能有一种方法可以一举做到。

申请(df,2,表格)

apply(df,2,function(x){sum(is.na(x))})

答案 4 :(得分:1)

由于变量是因素,您应该首先将它们转换为它:

df <- lapply(df, as.factor)

然后,汇总您的data.frame

sapply(df, summary)

summary()函数的因子方法计算每个级别。