【问题标题】:Two different id values for the same individuals in different datasets不同数据集中同一个人的两个不同 id 值
【发布时间】:2020-03-26 18:27:43
【问题描述】:

我有两个与两个不同数据集相关联的 id 值向量。这两个向量对应于相同的个体,但 id 向量是不相关的(并且每个数据集中的每个个体都有多个观察值)。我的目标是通过 id 合并它们,但由于 id 不同且长度不同,如果不匹配 id 就无法做到这一点。显然比我在示例中包含的数据要多得多。

a <- c(4033,4833,681,9567,6175,7112,3889,264,3918,7685)
b <- c(1,4,7,10,14,18,22,26,27,37)

所以 4033 = 1; 4833 = 4...等

虚拟数据集1:

id day y
1  1   10
1  2   4
1  3   2
4  1   9
4  2   10
4  3   6

虚拟数据集2:

id   day y1
4033 1   100
4033 1   120
4033 2   150
4033 3   200
4833 1   120
4833 2   100
4833 2   50
4833 3   100 
4833 3   200

我想要的是一种简单的方法:

虚拟数据集 1 输出:

id day y  id.2
1  1   10 4033
1  2   4  4033
1  3   2  4033
4  1   9  4833
4  2   10 4833
4  3   6  4833

我正在尝试一个 forloop 中的解决方案,例如:

for (i in length(dataset)) {
  dataset$id[dataset[[1]] %in% int] <- int1
}

但这不能正常工作(可能是因为我错过了一个明显的原因)。

【问题讨论】:

    标签: r


    【解决方案1】:

    由于我们有两个向量,我们可以轻松地创建与base R 中的命名向量的匹配

    df1$id.2 <- setNames(a, b)[as.character(df1$id)]
    df1
    #  id day  y id.2
    #1  1   1 10 4033
    #2  1   2  4 4033
    #3  1   3  2 4033
    #4  4   1  9 4833
    #5  4   2 10 4833
    #6  4   3  6 4833
    

    或者另一个base R选项是match

    df1$id.2 <- a[match(df1$id, b)]
    

    数据

    df1 <- structure(list(id = c(1L, 1L, 1L, 4L, 4L, 4L), day = c(1L, 2L, 
    3L, 1L, 2L, 3L), y = c(10L, 4L, 2L, 9L, 10L, 6L)),
    class = "data.frame", row.names = c(NA, 
    -6L))
    
    df2 <- structure(list(id = c(4033L, 4033L, 4033L, 4033L, 4833L, 4833L, 
    4833L, 4833L, 4833L), day = c(1L, 1L, 2L, 3L, 1L, 2L, 2L, 3L, 
    3L), y1 = c(100L, 120L, 150L, 200L, 120L, 100L, 50L, 100L, 200L
    )), class = "data.frame", row.names = c(NA, -9L))
    

    【讨论】:

    • 示例完美运行。我不知道 setNames。当我在我的实际数据集(形式与示例相同)上运行时,我在 id.2 列中捕获了所有 NA - 没有弹出错误。
    • @Mik 你能做到吗setNames(as.character(a), b)[as.character(df1$id)]
    • @Mik 或者如果你可以dput举个例子,更容易知道确切的结构
    • @Mik 你能试试matcha[match(df1$id, b)]
    【解决方案2】:

    另一种方法是制作 ID 的 data.frame 并使用merge

    datasetID <- data.frame(id = b, id.2 = a)
    merge(dataset1,datasetID)
      id day  y    a
    1  1   1 10 4033
    2  1   2  4 4033
    3  1   3  2 4033
    4  4   1  9 4833
    5  4   2 10 4833
    6  4   3  6 4833
    

    数据

    a <- c(4033,4833,681,9567,6175,7112,3889,264,3918,7685)
    b <- c(1,4,7,10,14,18,22,26,27,37)
    dataset1 <- structure(list(id = c(1L, 1L, 1L, 4L, 4L, 4L), day = c(1L, 2L, 
    3L, 1L, 2L, 3L), y = c(10L, 4L, 2L, 9L, 10L, 6L)), class = "data.frame", row.names = c(NA, 
    -6L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 2020-12-22
      相关资源
      最近更新 更多