【问题标题】:Merge contents from three dataframes into one column将三个数据框的内容合并为一列
【发布时间】:2019-07-26 11:09:54
【问题描述】:

我有以下三个data.frames。

 df1 <- data.frame(c("A", "B", "C", "D"), 
      c("text1", "texta", "textk", "textx"))
 names(df1) <- c('dummy_1', 'dummy_2')
 df2 <- data.frame(c("A", "B", "C", "D"), 
      c("text2", "textb", "textl", "texty"))
 names(df2) <- c('dummy_1', 'dummy_3')
 df3 <- data.frame(c("A", "B", "C", "D"), 
      c("text3", "textc", "textm", "textz"))
 names(df3) <- c('dummy_1', 'dummy_4')

如何将df1df2df3 中的dummy_2dummy_3dummy_4 列中的文本分别合并为一列,用" \n " 分隔?所以想要的结果就是这个data.frame:

 dummy_1    merged
 A          text1 \n text2 \n text3
 B          texta \n textb \n textc
 C          textk \n textl \n textm
 D          textx \n texty \n textz

【问题讨论】:

  • 感慨万千,但您无需对 cme​​ts 中的每个答案都说“谢谢”;一个赞成票被认为是足够的......
  • 好的,好吧,最后一次:谢谢(以及另一个支持)。

标签: r dataframe merge


【解决方案1】:

可以试试:

library(tidyverse)

list(df1, df2, df3) %>%
  reduce(left_join) %>%
  unite(merged, -dummy_1, sep = " \n ")

输出:

  dummy_1                  merged
1       A text1 \n text2 \n text3
2       B texta \n textb \n textc
3       C textk \n textl \n textm
4       D textx \n texty \n textz

【讨论】:

    【解决方案2】:

    merge:

    step1 <- merge(merge(df1, df2, by='dummy_1'), df3, by='dummy_1')
    result <- transform(step1, merged=paste(dummy_2, dummy_3, dummy_4, sep='\n'))
    

    附带说明,您不必在之后添加names

    df1 <- data.frame(dummy_1 = c("A", "B", "C", "D"), 
      dummy_2 = c("text1", "texta", "textk", "textx"))
    

    【讨论】:

      【解决方案3】:

      合并所有三个数据框(您可以使用cbind()$-引用,但如果dummy_1 以不同顺序列出值,合并会更安全):

      df4 <- Reduce(merge, list(df1,df2,df3))
      

      (在生产代码中,您可能希望明确指定 by,就像在 @MrGumble 的回答中一样,但令人讨厌的是 Reduce() 不接受 ... 参数,因此您需要定义一个匿名函数)

      paste() 这些值加上" \n " 的分隔符(transform() 是装饰性的,可能不建议在生产代码中使用):

      df4 <- transform(df4,merged=paste(dummy_2,dummy_3,dummy_4,sep=" \n "))
      

      只保留所需的列:

      df4 <- df4[c("dummy_1","merged")]
      

      【讨论】:

      • 另一个很好的答案。非常感谢你,本。
      【解决方案4】:
      pasted <- paste(df1$dummy_2, df2$dummy_3, df3$dummy_4, sep = " \n ")
      
      df_pasted <- data.frame(dummy_1 = df1$dummy_1, merged = pasted)
      

      【讨论】:

      • 这有点不安全,因为它依赖于相同的订单 - mergeleft_join 稍好一些。但这确实解决了 OP 的问题。
      • 你是绝对正确的。你的答案是安全的。我的回答是针对具体情况的,但顺序可以是任意的,所以合并是最好的选择
      猜你喜欢
      • 1970-01-01
      • 2021-07-21
      • 2017-09-14
      • 1970-01-01
      • 2020-09-21
      • 2021-11-18
      • 2023-01-23
      • 2018-01-31
      相关资源
      最近更新 更多