仅使用公共row.names在R中组合data.frames

时间:2013-05-29 07:50:27

标签: r merge dataframe

我有五个data.frames,包含不同样本集的基因表达数据。我在每个data.set中有不同的行数,因此只有部分重叠的row.names(基因)。

现在我想要 a)过滤五个data.frames,只包含所有data.frames和。中存在的基因 b)将这些基因的基因表达数据与一个数据框架结合起来。

到目前为止,我所能找到的只是合并,但这只能合并两个data.frames,所以我必须多次使用它。有更简单的方法吗?

2 个答案:

答案 0 :(得分:5)

如果要排除每个数据框中不存在的行名,则合并效率不高。这是一个不同的提案。

首先,三个示例数据框:

df1 <- data.frame(a = 1:5, b = 1:5, 
                  row.names = letters[1:5]) # letters a to e
df2 <- data.frame(a = 1:5, b = 1:5, 
                  row.names = letters[3:7]) # letters c to g
df3 <- data.frame(a = 1:5, b = 1:5, 
                  row.names = letters[c(1,2,3,5,7)]) # letters a, b, c, e, and g
# row names being present in all data frames: c and e

将数据框放入列表中:

dfList <- list(df1, df2, df3)

查找常用行名称:

idx <- Reduce(intersect, lapply(dfList, rownames))

提取数据:

df1[idx, ]

  a b
c 3 3
e 5 5

<强> PS 即可。如果要保留所有数据框中的相应行,可以使用以下命令替换最后一步df1[idx, ]

do.call(rbind, lapply(dfList, "[", idx, ))

答案 1 :(得分:0)

查看this SO post中最重要的答案。只需列出您的数据框并应用以下代码行:

Reduce(function(...) merge(..., by = "x"), list.of.dataframes)

您只需调整by参数,以指定数据框应合并到哪个公共列。