不确定我的标题是否很好地表达了我的问题。如果您可以阅读此示例,则将更有意义。我想合并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]
我得到了想要的东西,但需要时间,而且容易出错。我认为必须有更有效的方法来做到这一点。有人可以帮忙吗?
答案 0 :(得分:0)
希望这对您的示例无效:
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