【问题标题】:From an R dataframe: count non-NA values by column, grouped by one of the columns来自 R 数据框:按列计数非 NA 值,按其中一列分组
【发布时间】:2018-07-05 15:19:56
【问题描述】:

我保证有一种更简单的方法可以实现我的目标。我需要计算数据帧的非 NA 值,按所述数据帧中的一列分组。 *这是我关于stackoverflow的第一个问题,请耐心等待。

这是我当前的代码:

测试数据:

grouping <- c(1234,5678,2359)
column1 <- c('asdf',NA,NA)
column2 <- c(NA,'asdf','asdf')
column3 <- c('asdf',NA,'asdf')
litmus <- data.frame(grouping, column1, column2, column3)

获取不同的组列表:

distinct_groups <- as.data.frame(litmus %>% distinct(grouping))
length(distinct_groups$grouping)

执行循环以通过分组并放入列表来计算非NA值

count_non_NA = list()
for (i in 1:length(distinct_groups$grouping)){
  count_non_NA[[i]]<-apply(litmus[grouping == as.numeric(distinct_groups$grouping[i]),], 2, function(x) length(which(!is.na(x))))}

将组名输入列表并转换为数据框

names(count_non_NA) <- distinct_groups$grouping
count_non_NA <- as.data.frame(count_non_NA)
count_non_NA

【问题讨论】:

  • 我使用 stats 中的聚合函数将其汇总在一起。 aggregate(litmus, by = list(groupingnonNA = grouping), FUN = function(x){sum(!is.na(x))})我不确定这是否符合您想要的输出,所以没有作为答案提交,但希望您可以编辑以满足要求

标签: r dataframe


【解决方案1】:

我们可以使用summarise_all

library(dplyr)
litmus %>% 
   group_by(grouping) %>% 
   summarise_all(funs(sum(!is.na(.))))

【讨论】:

    【解决方案2】:

    我添加了一些额外的观察结果,以便您了解分组的工作原理,因为您提供的示例中每个组只有 1 个观察结果。

    library(dplyr)
    
    grouping <- c(1234,5678,2359, 1234,5678,2359)
    column1 <- c('asdf',NA,NA, 'asdf',NA,NA)
    column2 <- c(NA,'asdf','asdf', NA,'asdf','asdf')
    column3 <- c('asdf',NA,'asdf', 'asdf',NA,'asdf')
    litmus <- data.frame(grouping, column1, column2, column3)
    
    litmus %>% 
      dplyr::group_by(grouping) %>% 
      dplyr::summarise_at(vars(column1:column3), ~ sum(!(is.na(.))))
    
    # # A tibble: 3 x 4
    #   grouping column1 column2 column3
    #   <dbl>   <int>   <int>   <int>
    #   1234       2       0       2
    #   2359       0       2       2
    #   5678       0       2       0
    

    【讨论】:

      【解决方案3】:

      可以很简单 sum(!is.na(column name)) 为每个向量...

      对于使用 dplyr 的数据框:

      df%>%group_by(grouping_variable)%>%summarise("nonNAcol1"= sum(!is.na(col1name),
      

      .....等等。对于其他列)

      对于未知数,可以使用对列或 seq_along 列应用函数的更通用的解决方案。检查 SO 以获取更多和 dplyr 教程。 R4ds 第 5 章..http://r4ds.had.co.nz/transform.html

      干杯。

      【讨论】:

      • 只需搜索 na.omit 上的条目或计算 NA 值...更多种类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 2016-06-27
      • 2021-10-03
      • 2017-05-09
      • 1970-01-01
      相关资源
      最近更新 更多