根据R中的列名和行名合并多个DF

问题描述 投票:0回答:1

我有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 dplyr reshape
1个回答
0
投票

这是一个基本的 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

© www.soinside.com 2019 - 2024. All rights reserved.