【问题标题】:Suffixes when merging more than two data frames with full_join使用 full_join 合并两个以上数据帧时的后缀
【发布时间】:2023-03-23 20:08:01
【问题描述】:

我想使用嵌套的 full_join 将多个数据框合并在一起。此外,我希望能够为所有列添加后缀,以便在合并数据帧时,每个列名都指示它来自哪个数据帧(例如,唯一的时间标识符,如 T1、T2、... )。

x <- data.frame(i = c("a","b","c"), j = 1:3, h = 1:3, stringsAsFactors=FALSE)
y <- data.frame(i = c("b","c","d"), k = 4:6, h = 1:3, stringsAsFactors=FALSE)
z <- data.frame(i = c("c","d","a"), l = 7:9, h = 1:3, stringsAsFactors=FALSE)

full_join(x, y, by='i') %>% left_join(., z, by='I')

有没有办法集成默认后缀选项,以便我得到一个列名如下的数据集:

column_names <- c("i", "j_T1", "h_T1", "k_T2", "h_T2", "l_T3", "h_T3")

【问题讨论】:

  • 在这种情况下你想要的输出是什么?
  • 列的编号是否需要按照它们出现的顺序排列?可能是 H 的不同顺序,例如有 3 列? column_names

标签: r join dplyr


【解决方案1】:

我认为这可以通过使用 purrr 处理列标题来完成,但我使用了 pivot_wider 和 pivot_longer 来更改标题名称:

df <- x %>% 
  full_join(y, by = "i") %>% 
  full_join(z, by = "i") %>% 
  pivot_longer(cols = -i,
               names_to = "columns",
               values_to = "values") %>% # makes the column headers into a column 
which can be changed
  mutate(columns = str_replace(columns, ".x", "_T2"),
         columns = str_replace(columns, ".y", "_T3"),
         columns = case_when(!str_detect(columns, "T") ~ paste0(columns, "_T1"),
                             TRUE ~ columns)) %>% 
  pivot_wider(names_from = columns,
              values_from = values)

这些与列出的标题不匹配,但如果订单很重要并且列 l 应为 T3(本例中只有 1),希望此代码有助于您开始。

【讨论】:

    【解决方案2】:

    将数据框放入列表中,添加数据框名称作为后缀并执行连接。

    library(dplyr)
    library(purrr)
    
    lst(x, y, z) %>%
      imap(function(x, y) x %>% rename_with(~paste(., y, sep = '_'), -i)) %>%
      reduce(full_join, by = 'i')
    
    #  i j_x h_x k_y h_y l_z h_z
    #1 a   1   1  NA  NA   9   3
    #2 b   2   2   4   1  NA  NA
    #3 c   3   3   5   2   7   1
    #4 d  NA  NA   6   3   8   2
    

    【讨论】:

      猜你喜欢
      • 2021-01-06
      • 2020-09-20
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多