Копирование значений столбца между кадрами данных в зависимости от значений другого столбца

#r #dataframe

Вопрос:

У меня есть эти два кадра данных:

 a <- c('A','B','C','D','E','F','G','H')
b <- c(1,2,1,3,1,3,1,6)
c <- c('K','K','H','H','K','K','H','H')

frame1 <- data.frame(a,b,c)

a <- c('A','A','B','B','C','C','D','D','E','E','F','F','G','H','H')
d <- c(5,5,6,3,1,9,1,0,2,3,6,5,5,5,4)
e <- c('W','W','D','D','D','D','W','W','D','D','W','W','D','W','W')

frame2<- data.frame(a,d,e)
 

И теперь я хочу включить столбец » e » из «фрейма 2» в «фрейм1″ в зависимости от совпадающего значения в столбце » a » обоих фреймов данных. Примечание: «e» одинаково для всех строк с одинаковым значением в «a».

Результат должен выглядеть так:

   a b c e
1 A 1 K W
2 B 2 K D
3 C 1 H D
4 D 3 H W
5 E 1 K D
6 F 3 K W
7 G 1 H D
8 H 6 H W
 

Какие-нибудь сладости?

Комментарии:

1. merge(frame1, frame2, by = 'a') и удалите столбец d из этого

Ответ №1:

Вы можете использовать match для сопоставления значения в столбце » а » обоих фреймов данных:

 frame1$e <- frame2$e[match(frame1$a, frame2$a)]
frame1
#  a b c e
#1 A 1 K W
#2 B 2 K D
#3 C 1 H D
#4 D 3 H W
#5 E 1 K D
#6 F 3 K W
#7 G 1 H D
#8 H 6 H W
 

или с помощью merge :

 merge(frame1, frame2[!duplicated(frame2$a), c("a", "e")], all.x=TRUE)
 

Ответ №2:

вы можете выполнить операцию объединения для столбца «a» обоих фреймов данных и принимать только те значения, которые совпадают. вы можете выполнить соединение слева , а затем удалить столбец » a » из 2-го кадра данных, а также удалить остальные столбцы, которые не нужны из 2-го кадра данных.

Ответ №3:

С помощью dplyr :

 library(dplyr)

frame2 %>%
  distinct(a, e, .keep_all = TRUE) %>%
  right_join(frame1, by = 'a') %>%
  select(-d) %>%
  arrange(a)

#  a e b c
#1 A W 1 K
#2 B D 2 K
#3 C D 1 H
#4 D W 3 H
#5 E D 1 K
#6 F W 3 K
#7 G D 1 H
#8 H W 6 H