【问题标题】:r merging 2 data frames that have both common and unique variables into long datar 将具有共同变量和唯一变量的 2 个数据帧合并为长数​​据
【发布时间】:2018-11-26 05:31:18
【问题描述】:

不确定我的标题是否能很好地表达我的问题。如果您可以阅读此示例,它将更有意义。我想合并 2 个数据框,它们是 2 波纵向调查。 Time1 数据框的参与者多于 Time2 数据框,因为并非每个人都返回了 Time 2 调查。两次都测量了一些变量,但还有一些变量仅在每个数据帧中可用。例如,

> d1
   ID v1 v2 T v3
1  1  A  E 1  6
2  2  B  D 1  7
3  3  C  C 1  8
4  4  D  B 1  9
5  5  E  A 1 10

> d2
  ID v1 v2 T  v4
1  1  F  A 2 100
2  3  G  B 2 101
3  5  H  C 2 102

我想通过合并两者来制作一个长数据集,只保留数据在两个时间都可用的参与者并保持所有变量。我希望合并后的数据看起来像 d3:

> d3
  ID v1 v2 T v3  v4
1  1  A  E 1  6 100
2  3  C  C 1  8 101
3  5  E  A 1 10 102
4  1  F  A 2  6 100
5  3  G  B 2  8 101
6  5  H  C 2 10 102

我使用的代码如下。

d4<- merge(d1, d2, by=intersect(names(d1), names(d2)), all= TRUE)
d4<-d4[d4$ID %in% d4$ID[duplicated(d4$ID)],]

d4<- arrange(d4, T, ID)

d4[1:3, 6] <- d4[4:6, 6]
d4[4:6, 5] <- d4[1:3, 5]

我得到了我想要的,但这需要时间并且容易出错。我认为必须有更有效的方法来做到这一点。有人可以帮忙吗?

【问题讨论】:

    标签: r dataframe join merge longitudinal


    【解决方案1】:

    希望这超出您的示例:

    library(dplyr)
    
    # Create an intermediate frame for just v3 and v4
    d1a <- d1 %>% 
    select(ID, v3)
    
    d2a <- d2 %>%
    select(ID, v4) %>%
    merge(d1a)
    
    d3 <- d1 %>% 
    bind_rows(d2) %>% # Stack one frame on top of the other
    select(-c(v3, v4)) %>% 
    merge(d2a, by="ID", all.x = TRUE) %>% # Merge in to each case of those IDs
    filter(complete.cases(.)) %>% # Remove rows with NAs
    arrange(`T`) %>% # Arrange by T
    select(ID, v1, v2, `T`, v3, v4) # Order from low to high to match your end data
    

    结果:

      ID v1 v2 T v3  v4
    1  1  A  E 1  6 100
    2  3  C  C 1  8 101
    3  5  E  A 1 10 102
    4  1  F  A 2  6 100
    5  3  G  B 2  8 101
    6  5  H  C 2 10 102
    

    【讨论】:

    • 谢谢。不幸的是,在实际数据中,我有数百个变量,所以我不想手动选择每个数据集中唯一的变量......有什么想法吗?
    • 我怀疑发生了什么事,但如果没有反映您的完整数据的 reprex 示例,真的很难说。最令人困惑的是,有些变量看起来像是为同一个 ID(V1 和 V2)记录了两次,而其他变量则保持不变。
    • 你在问为什么数据看起来像这样吗?不确定我是否理解你的问题,但我会尽力解释。将 v1 和 v2 视为与健康相关的变量,而 v3 和 v4 是人口统计变量,如年龄或性别。我对健康变化感兴趣,因此对相同 ID 进行两次测量,但不是 V3 和 V4。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多