我有一个比我在这里意识到的更大的挑战:将三个数据帧的内容合并到一个列中,这就是我的新问题。我有以下三个数据帧。
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
感谢您的任何建议。
使用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"
使用dplyr
和tidyr
可以
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
希望这能有所帮助。