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

Posted

技术标签:

【中文标题】如何在 R 中加入多个数据框但排除某些列?【英文标题】:How to join multiple dataframes in R but exclude some columns? 【发布时间】:2021-12-24 00:43:17 【问题描述】:

我总共有 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 列和 last 列,例如telangiectasia_24_logistic_resid(来自上述数据框 - 也以粗体突出显示)。我感兴趣并希望保留的 12 个数据帧中的每一个的最后一列。

我希望我的最终数据框的 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

我不介意进行完全合并,但这将保留我不感兴趣的额外列(例如年龄 bmi 手术类型 1)。我只想要 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 的值在所有数据帧中都不同?如果是这样,我不会认为这是合并,因为没有匹配发生。也许dplyr::bind_rows(data1, data2, data3, ...) 我会说它们 99% 相似——只是一些数据框可能不包含特定 ID,因为表型没有价值,因此它被排除在外,结果 ID 丢失,但ID 可能存在于另一个数据框中,因为它具有特定的表型值。因此,我希望将所有数据框连接在一起 - 它只是缺失表型的 NA。 【参考方案1】:

您可以通过创建一个数据框列表来解决此问题,每个数据框仅包括 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

【讨论】:

对不起,我很笨,但是 x、y 和 z 是什么? a b 和 c 是什么?在上面的第一个例子中? 您的问题是您只想保留每个数据框的最后一列(带有 ID)。所以我为我的小例子编了一些列名。 x、y 和 z 是我不想保留的中间列。 a、b 和 c 是我的数据框中最后一列的名称。 你只需要从dfl &lt;- ...这一行开始 感谢您的回复。执行 dfl1 时出现错误:'d[, c("id", tail(names(d), 1))] 中的错误:维数不正确' 让我们continue this discussion in chat。

以上是关于如何在 R 中加入多个数据框但排除某些列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在JAVA中加入没有重复列的Spark数据框

如何在JAVA中加入没有重复列的Spark数据框

当键分为列时,如何在 Apache Pig 中加入两个商店?

如何在 SQL 中加入六个表,同时只包含某些行?

如何在使用 eloquent 时排除某些列

如何在pyspark中加入具有多个重叠的两个数据框