我有3个Dfs
我需要根据列和行名称拆分它,如下所示
我尝试了 reshape 中的 merge_recurse 选项,看起来它是逐行合并的。请帮助我并排添加列。
最终输出应将所有 DF 中的相同列合并到每个新 DF 中,如下所示,
C1.DF1 C1.DF2 C1.DF3
G1 0 1 NA
G2 3 NA 1
G3 3 NA 2
G4 NA 0 NA
G5 NA 2 NA
G6 NA NA 4
C2.DF1 C2.DF2 C2.DF3
G1 0 2 NA
G2 1 NA 1
G3 1 NA 3
G4 NA 2 NA
G5 NA 1 NA
G6 NA NA 3
C3.DF1 C3.DF2 C3.DF3
G1 1 3 NA
G2 2 NA 1
G3 1 NA 4
G4 NA 2 NA
G5 NA 3 NA
G6 NA NA 2
df1<- data.frame(C1=c(0,3,3),C2=c(0,1,1),C3=c(1,2,1),row.names = c("G1","G2","G3"))
df2<- data.frame(C1=c(1,0,2),C2=c(2,2,1),C3=c(3,2,3),row.names = c("G1","G4","G5"))
df3<- data.frame(C1=c(1,2,4),C2=c(1,3,3),C3=c(1,4,2),row.names = c("G2","G3","G6"))
df_list<- list(df1,df2,df3)
data<- merge_recurse(df_list)
这是我使用merge_recurse后得到的。 (https://i.sstatic.net/wiwfS8eY.png)
这是一个基本的 R 解决方案。
创建一个包含行名称的列,并返回 df,其中新列位于第一位。通过管道连接到
Reduce
将数据集合并到一个输出 df 中。
df1<- data.frame(C1=c(0,3,3),C2=c(0,1,1),C3=c(1,2,1),row.names = c("G1","G2","G3"))
df2<- data.frame(C1=c(1,0,2),C2=c(2,2,1),C3=c(3,2,3),row.names = c("G1","G4","G5"))
df3<- data.frame(C1=c(1,2,4),C2=c(1,3,3),C3=c(1,4,2),row.names = c("G2","G3","G6"))
df_list<- list(df1,df2,df3)
df_list |>
lapply(\(x) {x$rn <- row.names(x); x[c(4, 1:3)]}) |>
Reduce(\(x, y) merge(x, y, all = TRUE), x = _)
#> rn C1 C2 C3
#> 1 G1 0 0 1
#> 2 G1 1 2 3
#> 3 G2 1 1 1
#> 4 G2 3 1 2
#> 5 G3 2 3 4
#> 6 G3 3 1 1
#> 7 G4 0 2 2
#> 8 G5 2 1 3
#> 9 G6 4 3 2
创建于 2024-07-04,使用 reprex v2.1.0