【问题标题】:Merge columns within dataframe based on column value R根据列值 R 合并数据框中的列
【发布时间】:2021-03-09 15:22:43
【问题描述】:

我目前有这个结构的数据框

    ID-No  cigsaday   activity  
    1      NA        1           
    2      NA        1          
    1       5       NA          
    2       5       NA          

我想连接具有相同 ID 号的行并创建一个应该看起来像这样的新数据框

ID-No  cigsaday   activity  
    1      5        1           
    2      5        1

数据框包括字符和数字,这样我们将根据在数据集中第一列中出现 4 次的参与者 ID 进行匹配。

感谢任何帮助!

【问题讨论】:

    标签: r dataframe merge


    【解决方案1】:

    data.table 选项

    > setDT(df)[, lapply(.SD, na.omit), ID_No]
       ID_No cigsaday activity
    1:     1        5        1
    2:     2        5        1
    

    数据

    > dput(df)
    structure(list(ID_No = c(1L, 2L, 1L, 2L), cigsaday = c(NA, NA,
    5L, 5L), activity = c(1L, 1L, NA, NA)), class = "data.frame", row.names = c(NA,
    -4L))
    

    【讨论】:

      【解决方案2】:

      通往罗马的方式有很多。为了完整起见,这里有一些其他方法可以返回给定样本数据集的预期结果。您的里程可能会有所不同。

      1。 dplyr, na.omit()

      library(dplyr)
      df %>% 
        group_by(ID_No) %>% 
        summarise(across(everything(), na.omit))
      
      `summarise()` ungrouping output (override with `.groups` argument)
      # A tibble: 2 x 3
        ID_No cigsaday activity
        <int>    <int>    <int>
      1     1        5        1
      2     2        5        1
      

      注意,这是ThomasIsCoding's answerdplyr 版本。

      2。 dplyr、reduce()、coalesce()

      library(dplyr)
      df %>% 
        group_by(ID_No) %>% 
        summarise(across(everything(), ~ purrr::reduce(.x, coalesce)))
      

      3。 data.table, fcoalesce()

      library(data.table)
      setDT(df)[, lapply(.SD, function(x) fcoalesce(as.list(x))), ID_No]
      
         ID_No cigsaday activity
      1:     1        5        1
      2:     2        5        1
      

      4。 data.table, Reduce(), fcoalesce()

      library(data.table)
      setDT(df)[, lapply(.SD, Reduce, f = fcoalesce), ID_No]
      

      【讨论】:

        【解决方案3】:

        使用 na.locf() 的一种可能解决方案,它用最近的非 NA 值替换一个值。

        library(zoo)
        
        dat %>% 
          group_by(IDNo) %>% 
          mutate_at(vars(-group_cols()),.funs=function(x) na.locf(x)) %>% 
          distinct(IDNo,cigsaday,activity,.keep_all = TRUE) %>% 
          ungroup()
        

        【讨论】:

          猜你喜欢
          • 2017-02-24
          • 2020-09-04
          • 1970-01-01
          • 2023-01-13
          • 1970-01-01
          • 1970-01-01
          • 2018-11-25
          • 1970-01-01
          • 2016-12-09
          相关资源
          最近更新 更多