Как перенести значения из одного кадра данных в другой? - PullRequest
0 голосов
/ 21 февраля 2019

Рассмотрим следующий код, дающий следующий фрейм данных

df1 <- data.frame("ID"=c("A", "A", "A", "A", "A", "B", "B", 'B', "B", "B"), 
 "X_A"=c(1,2,3,4,5,NA, NA, 8, 9,10), "X_B"=c(1,2,3,4,5,NA,NA, 8,9,10)
  ,"Y_A"=c(1,2,NA,NA, 10, 8,9,10,NA,NA), "Y_B"=c(1,2,NA, NA, 10,8, 
   9, 10, NA, NA))

, он выдает следующий фрейм данных

     ID X_A X_B Y_A Y_B
 1   A   1   1   1   1
 2   A   2   2   2   2
 3   A   3   3  NA  NA
 4   A   4   4  NA  NA
 5   A   5   5  NA  NA
 6   B  NA  NA   8   8
 7   B  NA  NA   9   9
 8   B   8   8  10  10
 9   B   9   9  NA  NA
 10  B  10  10  NA  NA

Я хочу перенести данные из этого фрейма в df2

   ID X_A Y_A
1   A   1   1
2   A   2   2
3   A   3   3
4   A   4   4
5   A   5   5
6   A   6   6
7   A   7   7
8   A   8   8
9   A   9   9
10  A  10  10
11  B   1   1
12  B   2   2
13  B   3   3
14  B   4   4
15  B   5   5
16  B   6   6
17  B   7   7
18  B   8   8
19  B   9   9
20  B  10  10

Конечный фрейм данных должен быть таким:

    ID X_A Y_A X_B Y_B
 1   A   1   1   1   1
 2   A   2   2   2   2
 3   A   3   3   3  NA
 4   A   4   4   4  NA
 5   A   5   5   5  NA
 6   A   6   6  NA  NA
 7   A   7   7  NA  NA
 8   A   8   8  NA  NA
 9   A   9   9  NA  NA
 10  A  10  10  NA  NA
 11  B   1   1  NA  NA
 12  B   2   2  NA  NA
 13  B   3   3  NA  NA
 14  B   4   4  NA  NA
 15  B   5   5  NA  NA
 16  B   6   6  NA  NA
 17  B   7   7  NA  NA
 18  B   8   8   8   8
 19  B   9   9   9   9
 20  B  10  10  10  10

Окончательный вывод похож на результат vlookup, где ID и X_A, ID и Y_A columsn из df1 и df2 совпадают, так чтосоответствующие значения X_B и Y_B заполняются в df2.В случае отсутствия совпадения, NA должен привести.Я попробовал следующий код

merge(df1, df2). 

, однако это замедляет мою систему.Я также попытался

library(dplyr)
df2 %>% right_join(df1, by=c(ID, x_A, y_A). 

Это приводит к появлению всех строк.Можно ли управлять ожидаемым результатом в R. попросить кого-нибудь помочь

1 Ответ

0 голосов
/ 21 февраля 2019

Вы имеете в виду, присоединитесь один раз по ID и X_A, чтобы получить X_B, а затем ID и Y_A, чтобы получить Y_B?Обратите внимание, что строка 10 отличается:

df2 %>% 
  left_join(select(df1, ID, X_A, X_B),
            by = c("ID", "X_A")) %>%
  left_join(select(df1, ID, Y_A, Y_B),
            by = c("ID", "Y_A"))

# ID X_A Y_A X_B Y_B
# 1   A   1   1   1   1
# 2   A   2   2   2   2
# 3   A   3   3   3  NA
# 4   A   4   4   4  NA
# 5   A   5   5   5  NA
# 6   A   6   6  NA  NA
# 7   A   7   7  NA  NA
# 8   A   8   8  NA  NA
# 9   A   9   9  NA  NA
# 10  A  10  10  NA  10
# 11  B   1   1  NA  NA
# 12  B   2   2  NA  NA
# 13  B   3   3  NA  NA
# 14  B   4   4  NA  NA
# 15  B   5   5  NA  NA
# 16  B   6   6  NA  NA
# 17  B   7   7  NA  NA
# 18  B   8   8   8   8
# 19  B   9   9   9   9
# 20  B  10  10  10  10

База R:

want <- merge(df2, subset(df1, select = c(ID, X_A, X_B)), by = c("ID", "X_A"), all.x = TRUE)
(want <- merge(want, subset(df1, select = c(ID, Y_A, Y_B)), by = c("ID", "Y_A"), all.x = TRUE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...