【问题标题】:Counting 0`s, 1`s, 99`s and NA`s for each variable in a data frame为数据帧中的每个变量计算 0`s、1`s、99`s 和 NA`s
【发布时间】:2016-11-18 05:07:46
【问题描述】:

我有一个包含 118 个变量的数据框,其中包含 0's1's99'sNA's。我需要计算每个变量有多少99'sNA's1's0's99 是“不适用”,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)

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

    forest    water    rain    fire
1    8         5        8       6
0    7         6        6       6
99   2         3        4       4
NA   3         6        2       4

【问题讨论】:

  • lapply(df, table)。或sapply(df, table) 用于s简化输出而不是列表。

标签: r dataframe


【解决方案1】:

找不到好的骗子,所以这是我的评论作为答案:

数据框实际上是一个列列表。 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 类似于lapply,但它会尝试s简化结果,而不是总是返回list。在这两种情况下,您都可以将其他参数传递给正在应用的函数,例如 useNA = "always"table 以在输出中包含 NA

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

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


与其他一些答案进行比较:apply 类似于lapplysapply,但它适用于矩阵或更高维数组。您应该在data.frame 上使用apply 的唯一情况是您需要将函数应用于每一行。对于数据框列上的函数,首选lapplysapply。原因是apply 将首先将数据框强制转换为matrix,如果您有不同类的列,这可能会产生意想不到的后果。

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      应该这样做:

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

      【讨论】:

        【解决方案4】:

        可能有办法一举搞定。

        应用(df, 2, table)

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

        【讨论】:

          【解决方案5】:

          由于变量是因子,所以你应该先把它们变成它:

          df <- lapply(df, as.factor)
          

          然后,总结你的data.frame

          sapply(df, summary)
          

          summary() 函数的 factor 方法计算它的每个级别。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-04-03
            • 2014-11-02
            • 1970-01-01
            • 2012-02-01
            • 1970-01-01
            • 2014-02-14
            • 1970-01-01
            • 2015-08-30
            相关资源
            最近更新 更多