【问题标题】:summarize_all rows by grouping and define which value should be kept通过分组和定义应保留的值来汇总所有行
【发布时间】:2021-08-06 13:49:15
【问题描述】:

我有一个数据框,其中合并了多个数据源。这将创建具有相同 ID 的行。现在我想定义应该保留哪一行的哪些值。

到目前为止,我一直在使用 dplyr 和 group_by 并汇总所有以保留第一个值(如果它不是 NA)。

这是一个例子:

# function f for summarizing
f <- function(x) {
            x <- na.omit(x)
            if (length(x) > 0) first(x) else NA
          }
# test data
test <- data.frame(id = c(1,2,1,2), value1 = c("a",NA,"b","c"), value2 = c(0:4))

  id value1 value2
  1      a      0
  2   <NA>      1
  1      b      2
  2      c      3

合并时得到如下结果

test <- test %>% group_by(id) %>% summarise_all(funs(f))
id value1 value2
1 a           0
2 c           1

现在的问题是:替换 NA (na.omit) 已经有效,但是我如何定义不是数值 0,而是接受不等于 0 的值。所以预期的结果是这样的:

id value1 value2
1 a           2
2 c           1

【问题讨论】:

    标签: r dplyr summarize


    【解决方案1】:

    作为@RicS 旁注的旁注,从dplyr v1+ 开始,summarise_all() 已被弃用(被取代)。你应该使用across():

    test %>% 
      group_by(id) %>% 
      summarise(across(.f=f))
    

    【讨论】:

      【解决方案2】:

      你可以把f函数写成:

      library(dplyr)
      
      f <- function(x) x[!is.na(x) & x != 0][1]
      
      test %>% group_by(id) %>% summarise(across(.fns = f))
      
      #     id value1 value2
      #  <dbl> <chr>   <int>
      #1     1 a           2
      #2     2 c           1
      

      如果您的数据中没有非零或非 NA 值,使用 [1] 将自动返回 NA

      【讨论】:

        【解决方案3】:

        您可以修改您的 f 函数,方法是对不同于零的向量进行子集化

        f <- function(x) {
          x <- na.omit(x)
          x <- x[x != 0]
          if (length(x) > 0) first(x) else NA
        }
        

        旁注:dplyr 0.8.0 开始,funs 已弃用。您应该使用 lambda、函数列表或 lambda 列表。在这种情况下,我使用了一个 lambda:

        test %>%
          group_by(id) %>%
          summarise_all(~f(.))
        
        # A tibble: 2 x 3
             id value1 value2
          <dbl> <chr>   <int>
        1     1 a           2
        2     2 c           1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-06
          • 2019-11-19
          • 2018-12-11
          • 2020-06-18
          • 1970-01-01
          • 2016-03-14
          • 2020-05-15
          • 2020-08-22
          相关资源
          最近更新 更多