提问者:小点点

将三个数据帧中的内容合并到R中的一列(跨多列)


我有一个比我在这里意识到的更大的挑战:将三个数据帧的内容合并到一个列中,这就是我的新问题。我有以下三个数据帧。

 df1 <- data.frame(c("A", "B", "C", "D"), 
      c("text1", "texta", "textk", "textx"),
      c("texti", "textI", "texti", "textI"))
 names(df1) <- c('dummy_1', 'dummy_2', 'dummy_3')
 df2 <- data.frame(c("A", "B", "C", "D"), 
      c("text2", "textb", "textl", "texty"), 
      c("textii", "textII", "textii", "textII"))
 names(df2) <- c('dummy_1', 'dummy_2', 'dummy_3')
 df3 <- data.frame(c("A", "B", "C", "D"), 
      c("text3", "textc", "textm", "textz"),
      c("textiii", "textIII", "textiii", "textIII"))
 names(df3) <- c('dummy_1', 'dummy_2', 'dummy_3')
 dummy_1    dummy2_merge                 dummy3_merge
 A          text1 \n text2 \n text3      texti \n textii \n textiii
 B          texta \n textb \n textc      textI \n textII \n textIII
 C          textk \n textl \n textm      texti \n textii \n textiii
 D          textx \n texty \n textz      textI \n textII \n textIII

感谢您的任何建议。


共3个答案

匿名用户

使用data.table合并和替换

library(data.table)

setDT(df1);setDT(df2);setDT(df3)

df1[df2, on = .(dummy_1), `:=` (dummy_2 = paste0(dummy_2, ' \n ', i.dummy_2),
                                dummy_3 = paste0(dummy_3, ' \n ', i.dummy_3))][]
df1[df3, on = .(dummy_1), `:=` (dummy_2 = paste0(dummy_2, ' \n ', i.dummy_2),
                                dummy_3 = paste0(dummy_3, ' \n ', i.dummy_3))][] 

导致

   dummy_1                 dummy_2                    dummy_3
1:       A text1 \n text2 \n text3 texti \n textii \n textiii
2:       B texta \n textb \n textc textI \n textII \n textIII
3:       C textk \n textl \n textm texti \n textii \n textiii
4:       D textx \n texty \n textz textI \n textII \n textIII

匿名用户

通过base R的想法可以是,

d1 <- Reduce(function(...)merge(..., by = 'dummy_1'), list(df1, df2, df3))

sapply(unique(sub('\\..*', '', names(d1))), function(i) 
                                do.call(paste, c(d1[grepl(i, names(d1))], sep = ' \n ')))

#     dummy_1 dummy_2                   dummy_3                     
#[1,] "A"     "text1 \n text2 \n text3" "texti \n textii \n textiii"
#[2,] "B"     "texta \n textb \n textc" "textI \n textII \n textIII"
#[3,] "C"     "textk \n textl \n textm" "texti \n textii \n textiii"
#[4,] "D"     "textx \n texty \n textz" "textI \n textII \n textIII"

匿名用户

使用dplyrtidyr可以

library(dplyr)
library(tidyr)

df <- left_join(left_join(df1, df2, by='dummy_1'), df3, by='dummy_1') #combine into one dataframe based on dummy_1
df <- df %>% unite('dummy2_merge', grep('dummy_2', colnames(df), value = T), sep=' \n ') # unite columns that have dummy_2 in their colname
df <- df %>% unite('dummy3_merge', grep('dummy_3', colnames(df), value = T), sep=' \n ') # unite columns that have dummy_3 in their colname

有输出

  dummy_1            dummy2_merge               dummy3_merge
1       A text1 \n text2 \n text3 texti \n textii \n textiii
2       B texta \n textb \n textc textI \n textII \n textIII
3       C textk \n textl \n textm texti \n textii \n textiii
4       D textx \n texty \n textz textI \n textII \n textIII

希望这能有所帮助。