首页 文章

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

提问于
浏览
1

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

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

"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)

....

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

我不知道如何将 Headers 的名称更改为来自的数据集的名称 .

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

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

非常感谢你!

1 回答

  • 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 = ".")
        }
      }
    }
    

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

    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
    

相关问题