【问题标题】:R group by, counting non-NA valuesR分组,计算非NA值
【发布时间】:2016-12-14 19:02:59
【问题描述】:

我有一个散布着 NA 的数据框

toy_df
# Y  X1 X2 Label
# 5  3  3  A
# 3  NA 2  B
# 3  NA NA C
# 2  NA 6  B

我想按标签字段对其进行分组,并计算每个标签的每个变量中有多少非 NA 值。

desired output:
# Label Y  X1 X2
# A     1  1  1
# B     2  0  2
# C     1  0  0

目前我已经使用循环来完成此操作,但它速度慢且不整洁,我确信有更好的方法。

Aggregate 似乎已经完成了一半,但计数中包含 NA。

aggregate(toy_df, list(toy_df$label), FUN=length)

任何想法表示赞赏...

【问题讨论】:

    标签: r na


    【解决方案1】:

    我们可以使用data.table。将 'data.frame' 转换为 'data.table' (setDT(toy_df)),按 'Label' 分组,遍历 Data.table 的子集 (.SD) 并获取非 NA 值的 sum ( !is.na(x))

    library(data.table)
    setDT(toy_df)[, lapply(.SD, function(x) sum(!is.na(x))), by = Label]
    #   Label Y X1 X2
    #1:     A 1  1  1
    #2:     B 2  0  2
    #3:     C 1  0  0
    

    或与dplyr 使用相同的方法

    library(dplyr)
    toy_df %>% 
          group_by(Label) %>%
          summarise_each(funs(sum(!is.na(.))))
    

    或base R 选项,by 和 colSums 按逻辑矩阵的第 4 列分组 (!is.na(toy_df[-4]))

    by(!is.na(toy_df[-4]), toy_df[4], FUN = colSums)
    

    或者使用rowsum,除了使用rowsum 函数之外,使用与by 类似的方法。

    rowsum(+(!is.na(toy_df[-4])), group=toy_df[,4])
    #  Y X1 X2
    #A 1  1  1
    #B 2  0  2
    #C 1  0  0
    

    【讨论】:

      【解决方案2】:

      或者在基础R中

      aggregate(toy_df[,1:3], by=list(toy_df$Label), FUN=function(x) { sum(!is.na(x))})
      

      【讨论】:

        【解决方案3】:
        aggregate(cbind(toy_df$Y, toy_df$X1, toy_df$X2), list(toy_df$label),
                  FUN = function (x) sum(!is.na(x)))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-01
          • 2017-06-10
          • 2021-07-03
          • 1970-01-01
          • 2022-07-15
          • 2022-11-03
          • 1970-01-01
          • 2022-11-30
          相关资源
          最近更新 更多