使用R中的公共标识符合并多个表中的选择列

时间:2014-05-31 02:37:43

标签: r merge multiple-columns

我想将多个表中的选择列与以下组织合并(合并)。

这里有两个数据集作为我想要组合的例子

"dataset1"

A  B  C  D  E  F (header)

1  2  3  4  5  F1(1st row)

6  7  8  9  10 F2(2nd row)

11 12 13 14 15 F3 (3rd row)

....

"dataset2"

A  B  C  D  E  F (header)

16  17  18  19  20  F1(1st row)

21  22  23  24  25 F2(2nd row)

26 27 28 29 30 F3 (3rd row)

....

这里,所有不同数据集(我有超过100个数据集)的标题是相同的,我想使用F列中的名称(F1,F2,F3 ...超过F200)作为唯一标识符。 例如,如果我使用列F作为标识符组合来自所有不同数据集的列“A”,则结果应如下所示。另外,为了区分数据的来源,还需要将标题更改为数据集ID。

dataset1 dataset2    F (header)

1 16                 F1 (1st row)

6  21                F2 (2nd row)

11 26                F3 (3rd row)

....

请注意,我所有的数据集都包含不同的行数,因此可能会丢失与F1~F200对应的某些数据点值。在这种情况下,我想把NA或留空。

为此,我尝试了以下代码

x <- merge(dataset1, dataset2, by="F", all=T)

但是这样,我不能仅提取A列,而是合并外部列。

同样,我也试过

x <- Reduce(function(x, y) merge(x, y, all=TRUE, by=("F")), list(dataset1, dataset2))

这给了我与之前代码完全相同的结果。为了使用此代码进一步仅提取列A,我尝试了一个,但没有奏效。

x <- Reduce(function(x, y) merge(x, y, all=TRUE, by=("F")), list(dataset1[,1], dataset2[,1))

我不知道如何将标题名称更改为来自的数据集名称。

请理解我刚刚开始学习R基础知识。

我正在使用RStudio 0.98507,目前所有数据集(超过100个)都已加载并存在于“全球环境”中

非常感谢!

1 个答案:

答案 0 :(得分:1)

以下是一个包​​含以下四个示例数据框的解决方案:

dataset1 <- data.frame(A = c(1, 6, 11), 
                       B = c(2, 7, 12), 
                       C = c(3, 8, 12), 
                       D = c(4, 9, 13), 
                       E = c(5, 10, 14), 
                       F = c("F1", "F2", "F3"))

dataset2 <- data.frame(A = c(16, 21, 26),
                       B = c(17, 22, 27), 
                       C = c(18, 23, 28),
                       D = c(19, 24, 29),
                       E = c(20, 25, 30), 
                       F = c("F1", "F2", "F3"))

dataset3 <- data.frame(A = c(30, 61),
                       B = c(57, 90), 
                       C = c(38, 33),
                       D = c(2, 16),
                       E = c(77, 25), 
                       F = c("F1", "F2"))

dataset4 <- data.frame(A = c(36, 61),
                       B = c(47, 30), 
                       C = c(37, 33),
                       D = c(45, 10),
                       E = c(66, 29), 
                       F = c("F1", "F2"))

首先将它们组合成一个列表:

datasets <- list(dataset1, dataset2, dataset3, dataset4)

然后重命名除F列以外的所有列。这是因为稍后当我们将数据框合并在一起时,如果列都具有相同的名称,那么merge将尝试通过向名称添加.x.y来区分它们 - 当你只合并两个数据集时很好,但是两个以上的数据集会混淆。

for (i in seq_along(datasets)) {
  for (j in seq_along(colnames(datasets[[i]]))) {
    if (colnames(datasets[[i]])[j] != "F") {
      colnames(datasets[[i]])[j] <- paste(colnames(datasets[[i]])[j], i, sep = ".")
    }
  }
}

这为我们提供了数据框,其列标题如下所示:

datasets[[1]]
##   A.1 B.1 C.1 D.1 E.1  F
## 1   1   2   3   4   5 F1
## 2   6   7   8   9  10 F2
## 3  11  12  12  13  14 F3

然后使用Reduce

df <- Reduce(function(x, y) merge(x, y, all = TRUE, by = "F"), datasets)

并选择所需的列,在这种情况下,列名称中包含A的所有列:

df[, c("F", grep("A", names(df), value = TRUE))]
##    F A.1 A.2 A.3 A.4
## 1 F1   1  16  30  36
## 2 F2   6  21  61  61
## 3 F3  11  26  NA  NA