【问题标题】:r - merge rows in group while replacing NAs [duplicate]r - 在替换 NA 时合并组中的行 [重复]
【发布时间】:2018-05-11 13:41:07
【问题描述】:

我试图找到这个问题的答案,但找不到。如果有答案,我道歉并立即删除我的问题。

我正在尝试将几行合并为一个(此计算应在组上单独进行,在这种情况下,变量id 可用于分组),这样就不会留下任何 NA 值。

# initial dataframe
df_start <- data.frame(
  id = c("as", "as", "as", "as", "as", "bs", "bs", "bs", "bs", "bs"), 
  b = c(NA, NA, NA, NA, "A", NA, NA, 6, NA, NA), 
  c = c(2, NA, NA, NA, NA, 7, NA, NA, NA, NA), 
  d = c(NA, 4, NA, NA, NA, NA, 8, NA, NA, NA), 
  e = c(NA, NA, NA, 3, NA, NA, NA, NA, "B", NA), 
  f = c(NA, NA, 5, NA, NA, NA, NA, NA, NA, 10))

# desired output
df_end <- data.frame(id = c("as", "bs"), 
                     b = c("A", 6), 
                     c = c(2, 7), 
                     d = c(4, 8), 
                     e = c(3,"B"), 
                     f = c(5, 10))

【问题讨论】:

    标签: r merge dplyr row na


    【解决方案1】:

    不需要删除问题,它可能对某些用户有帮助。这将每个组汇总为每列的第一个非 NA 出现。

    library(dplyr)
    
    df_start <- data.frame(
      id = c("as", "as", "as", "as", "as", "bs", "bs", "bs", "bs", "bs"), 
      b = c(NA, NA, NA, NA, "A", NA, NA, 6, NA, NA), 
      c = c(2, NA, NA, NA, NA, 7, NA, NA, NA, NA), 
      d = c(NA, 4, NA, NA, NA, NA, 8, NA, NA, NA), 
      e = c(NA, NA, NA, 3, NA, NA, NA, NA, "B", NA), 
      f = c(NA, NA, 5, NA, NA, NA, NA, NA, NA, 10))
    
    df_start %>% 
      group_by(id) %>% 
      summarise_all(list(~first(na.omit(.))))
    

    输出:

    # A tibble: 2 x 6
      id    b         c     d e         f
      <fct> <fct> <dbl> <dbl> <fct> <dbl>
    1 as    A        2.    4. 3        5.
    2 bs    6        7.    8. B       10.
    

    当然,如果每列的每个组中出现多个值,您会丢失一些数据。

    【讨论】:

    • funs 已被弃用,这是什么情况?
    • 感谢我让它与 lambda 一起工作。我只是不认为我的由于内存而完成,因为它是一个包含 900k 行和 214 个变量和 514k 组的数据框。我使用 dplyr 完全连接并删除了重复的列。
    【解决方案2】:

    希望这会有所帮助,使用 dplyr

    df_start <- sapply(df_start, as.character)
    df_start[is.na(df_start)] <- " "
    df_start <- as.data.frame(df_start)
    
    library(dplyr)   
    df_start %>% 
      group_by(id) %>% 
      summarise_all(funs(trimws(paste(., collapse = '')))) -> df
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多