【问题标题】:Combining two dataframes with same columns in R在R中将两个具有相同列的数据框组合起来
【发布时间】:2021-07-28 00:11:46
【问题描述】:

我有一个由多名研究人员填写的表格。 我现在有(比如说)两种我想加入的表格。

表格一:

site   value1   Value2 
1      A          B
2      B          C 
3      NA         NA
4      NA         NA
5      A          NA

形式二

site   value1   value2 
1      NA         NA
2      NA         NA  
3      A          A
4      B          B
5      NA         NA

预期输出:

site   value1   value2 
1      A          B
2      B          B 
3      A          A
4      B          B
5      A          NA

我尝试使用dplyr 包尝试加入,但这与dplyr::bind_cols 几乎相同。

我更喜欢在tidyverse 中解决这个问题。非常感谢您的帮助!

问候

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    如果缺失值是NA,那么coalesce 会更容易。在这里,我们假设 'site' 值是相同的,并且在两个数据集中的顺序相同

    library(dplyr)
    df1 %>%
      mutate(across(starts_with('value'), ~ 
                   coalesce(., df2[[cur_column()]])))
    

    -输出

    #   site value1 value2
    #1    1      A      B
    #2    2      B      C
    #3    3      A      A
    #4    4      B      B
    #5    5      A   <NA>
    

    如果数据集在“站点”中存在差异,则在 .x 和 .y 列之间进行 left 连接和 coalesce。逻辑是循环across那些名称中有.x后缀的列,在循环内,检索列名(cur_column()),将后缀替换为.y,get该列的值并执行coalesce

    library(dplyr)
    df1 %>%
        left_join(df2, by = 'site') %>%
        mutate(across(ends_with('.x'), ~ 
                   coalesce(., get(str_replace(cur_column(), '\\.x$', '\\.y'))))) %>%
        select(-ends_with('.y')) %>%
        rename_with(~ str_remove(., '\\.x'), ends_with('.x'))
    
    #   site value1 value2
    #1    1      A      B
    #2    2      B      C
    #3    3      A      A
    #4    4      B      B
    #5    5      A   <NA>
    

    数据

    df1 <- structure(list(site = 1:5, value1 = c("A", "B", NA, NA, "A"), 
        value2 = c("B", "C", NA, NA, NA)), class = "data.frame", row.names = c(NA, 
    -5L))
    
    df2 <- structure(list(site = 1:5, value1 = c(NA, NA, "A", "B", NA), 
        value2 = c(NA, NA, "A", "B", NA)), class = "data.frame", row.names = c(NA, 
    -5L))
    

    【讨论】:

    • 这怎么知道要通过站点链接,还是现在只是位置?
    • 您好 Akrun,感谢您闪电般的快速响应!我将研究合并功能。我还编辑了我的 OP,因为我在表单中有多个列。你的方法容易调整吗?
    • @Stevestingray 在您的示例中,其中一列以大写字母开头。是错别字吗
    猜你喜欢
    • 2015-04-30
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2014-08-17
    相关资源
    最近更新 更多