• объединение двух фреймов данных, имеющих как общие, так и уникальные переменные, в длинные данные - PullRequest
0 голосов
/ 26 ноября 2018

Не уверен, что мой заголовок хорошо передает мой вопрос.Это будет иметь больше смысла, если вы сможете прочитать этот пример.Я хотел бы объединить 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]

Я получил то, что хотел, но это требует времени и подвержено ошибкам.Я думаю, что должны быть более эффективные способы сделать это.Может ли кто-нибудь помочь?

1 Ответ

0 голосов
/ 26 ноября 2018

Надеюсь, это работает за пределами вашего примера:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...