如何在 R 中连接多个数据框但排除某些列?

How to join multiple dataframes in R but exclude some columns?

我总共有 12 个数据帧,行数和列数不同。例如第一个看起来像:

   id age   bmi  surgerytype1 surgerytype2 surgerytype3 telangiectasia_G1
1 RQ00001-2  62 29.00                    0                    1                    0                      
2 RQ00002-0  47 21.72                    1                    0                    0                      
3 RQ00004-9  56 28.04                    1                    0                    0                      
4 RQ00005-4  63 31.23                    1                    0                    0                      
5 RQ00006-5  68 21.94                    1                    0                    0                      
6 RQ00007-7  55 22.84                    1                    0                    0 
                     
  cvd rt_axilla **telangiectasia_24_logistic_resid**
1   1         0                        1.6703390
2   0         0                       -0.2387378
3   0         0                       -0.3638869
4   0         0                       -0.4635757
5   0         0                       -0.3235804
6   1         0                       -0.3815662

大多数数据框都遵循这些格式,但它们可能多一列或少一列。此外,它们的行数可能略有不同。我想通过 'id' 将所有这些数据帧合并在一起。所有这些数据帧在第 1 列中都有 'id',这在所有数据帧中应该相似但不相同。

此外,我特别感兴趣的列是 id 列和最后一列,例如telangiectasia_24_logistic_resid(来自上面的数据框 - 也以粗体突出显示)。我感兴趣并希望保留的 12 个数据帧中的每一个的所有最后一列。

我希望我的最终数据框在第一列中具有 ID,然后在其他数据框的最后一列中具有 ID,例如

id  last_colfrom_dataframe_1 last_colfrom_dataframe_2 last_colfrom_dataframe_3 etc...
RQ00001-2     <-- DATA/VALUES  -->
RQ00002-0 
RQ00004-9 
RQ00005-4 
RQ00006-5 
RQ00007-7

我不介意进行完全合并,但这会保留我不感兴趣的额外列(例如 age bmi surgerytype1)。我只想要所有数据框中的 id 和最后一列。

我已经在 R 中尝试过此合并和 full_join 命令,但它不起作用。

residual_tox <- merge(resid_ID_telang_g1, resid_ID_atrophyg1, resid_ID_atrophyg2, resid_ID_NipRetract_G1, NipRetract_G2_resid, resid_ID_oedema1, Odema_G2_resid_ID, Indur_G1_resid_ID, Indur_outside_resid_ID, Indur_G2_resid_ID, arm_lymoG1_ID, late_hyperpig_ID, by = "id")

提前致谢。

您可以通过制作一个数据框列表来解决这个问题,每个数据框仅包括 ID 列和您要保留的列,然后使用此列表使用 Reduce 函数生成合并的数据框。

假设您的数据帧被称为 df1df2df3,如下所示。每个都有一个 id 列,一个我想丢弃的列和我想保留的最后一列。请注意,ID 不一定重叠。

df1 <- data.frame(id=c(1,2), x=c("a", "b"), a=c("a", "b"))
df2 <- data.frame(id=c(2,3), y=c("a", "b"), b=c("cc", "ss"))
df3 <- data.frame(id=c(1,3), z=c("a", "b"), c=c("22", "1"))

现在制作一个包含每个数据框的列表,但只包含第一列和最后一列。

dfl <-  lapply(list(df1, df2, df3), function(d) d[, c("id", tail(names(d),1))])

然后 Reduce 函数可以获取此列表,并依次应用 merge 直到它们全部合并:

Reduce(function(x1, x2) merge(x1, x2, all=TRUE, by="id") ,  dfl)

这给出了我认为您期望的输出:

  id    a    b    c
1  1    a <NA>   22
2  2    b   cc <NA>
3  3 <NA>   ss    1