如何在 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
函数创建合并的数据框。
假设您的数据帧被称为df1
、df2
、df3
,如下所示。每个都有一个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 <- ...
这一行开始
感谢您的回复。执行 dfl1 时出现错误:'d[, c("id", tail(names(d), 1))] 中的错误:维数不正确'
让我们continue this discussion in chat。以上是关于如何在 R 中加入多个数据框但排除某些列?的主要内容,如果未能解决你的问题,请参考以下文章