如何在 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
函数生成合并的数据框。
假设您的数据帧被称为 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
我总共有 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
函数生成合并的数据框。
假设您的数据帧被称为 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