【问题标题】:Merge data sets based on group identifiers根据组标识符合并数据集
【发布时间】:2020-04-14 21:29:03
【问题描述】:

我有 2 个数据集,其中包含 2 种不同类型的观察结果。观察是在不同的日子里进行的,并以不同的时间间隔记录下来。

这两条记录都有一个序列号,用于识别进行观察的人群。例如序列号 111 表示一群人。这个小组是由不同数量的人组成的。属于这些群体的人数各不相同。例如组 111 由 3 人组成。在日记中,我们可以通过serialid1 变量来识别属于不同群体的人。例如serial 111 and id1 2 表示观察是由组 111 中的第二个人进行的。还有一个 Day 变量表示进行观察的工作日。 Day 变量从 1(Monday) to 7 (Sunday) 获取值。

如果在df1 中我们每人有 1 次观察,在df2 中每个人必须进行 2 次观察。可以根据serial, id1 and id2 识别进行观察的人。 Id2 用于区分工作日的观察结果。例如 id 111、id1 3 和 id2 2 可以解释为组 111 中的第 2 个人进行的 2 天观察。观察的工作日同样由Day 变量保存。

我想找出那些在同一天在两本日记中记录信息的人。那么,谁是在同一天填写这两个记录的人。问题是df2 有 2 个观察值,df1 每人只有一个,这使得合并变得困难。

我基于serial and id1 合并,但它们不是唯一标识符。我尝试创建一个新变量并在“日”级别合并。

如何在每日级别上合并 2 个数据集?

library(dplyr)

df1<-df1 %>% 
      mutate(index = group_indices_(df1, .dots=c("serial", "id1"))) 

df2<-df2 %>% 
      mutate(index = group_indices_(df2, .dots=c("serial", "id1", "id2")))

样品日期:

df1

structure(list(serial = c(12, 123, 123, 10, 10), id1 = c(1, 1, 
2, 1, 2), Day = c(1, 3, 2, 4, 2)), class = "data.frame", row.names = c(NA, 
-5L))

df2

structure(list(serial = c(12, 12, 123, 123, 123, 123, 10, 10, 
10, 10, 10, 10), id1 = c(1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 3, 3), 
    id2 = c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2), Day = c(1, 6, 
    3, 7, 2, 7, 4, 7, 2, 7, 4, 7), index = c(7L, 8L, 9L, 10L, 
    11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L)), row.names = c(NA, -12L
), class = "data.frame")

样本数据结果:

serial id1 id2 Day
12      1   1   1
123     1   1   3
123     2   1   2
10      1   1   4
10      2   1   2

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您可以使用 data.table 使用更新连接将对应的 id2 值从 df2 添加到 df1

    library(data.table)
    setDT(df1)
    setDT(df2)
    
    df1[df2, id2 := i.id2, on = .(serial, id1, Day)]
    
    df1
    #    serial id1 Day id2
    # 1:     12   1   1   1
    # 2:    123   1   3   1
    # 3:    123   2   2   1
    # 4:     10   1   4   1
    # 5:     10   2   2   1
    

    【讨论】:

      【解决方案2】:

      您可以尝试merge,如下所示

      merge(df1,df2,all.x = T)[1:4]
      

      这样

      > merge(df1,df2,all.x = T)[1:4]
        serial id1 Day id2
      1     10   1   4   1
      2     10   2   2   1
      3     12   1   1   1
      4    123   1   3   1
      5    123   2   2   1
      

      【讨论】:

        【解决方案3】:

        使用合并: out <- merge(d1, d2, by = c('serial', 'id1')) 然后选择列serial、id1、id2、Day

        【讨论】:

        • 非常感谢我试过这个,我收到了缺少 id2 值的重复值
        • 过滤它们:out[ !is.na(out$id2), ]
        猜你喜欢
        • 2016-05-14
        • 2021-04-01
        • 1970-01-01
        • 2015-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 2018-04-08
        相关资源
        最近更新 更多