объединение фреймов данных и замещающих строк - PullRequest
0 голосов
/ 24 августа 2018

У меня есть такая таблица: data1

  V1 V2 V3
1  a  d  t
2  b  d  w
3  c  e  t
4  a  d  t
5  b  f  w
6  c  g  t
7  a  h  w
8  b  k  w
9  c  e  w

и data2:

  V1 V2 V3
1  a  d  w
2  b  f  t
3  c  e  t

Теперь я хотел бы заменить V3 из data1 на V3 из data2 для всех строк, которыеидентичны в V1 и V2.Так что я получаю таблицу как это:

   V1 V2 V3
1  a  d  w
2  b  d  w
3  c  e  t
4  a  d  t
5  b  f  t
6  c  g  t
7  a  h  w
8  b  k  w
9  c  e  t

Есть идеи?

Спасибо за вашу помощь!

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Я не уверен, что это самый эффективный ответ, и вы должны быть осторожны при расширении до больших фреймов данных. Поскольку V3 существует как в data1, так и в data2, и мы не используем его для объединения, соединение автоматически прикрепит суффикс для их различения. В этом примере это очень просто, но убедитесь, что вы знаете, как это работает, если вы используете более сложные ситуации.

library(tidyverse)
data1 <- data_frame(V1=rep(c('a','b','c'),3),
                    V2=c('d','d','e','d','f','g','h','k','e'),
                    V3=c('t','w','t','t','w','t','w','w','w'))

data2 <- data_frame(V1=c('a','b','c'),
                    V2=c('d','f','e'),
                    V3=c('w','t','t'))

left_join(data1,data2,by=c('V1','V2')) %>%
  mutate(V3=coalesce(V3.y,V3.x)) %>%
  select(-V3.x,-V3.y)

# A tibble: 9 x 3
  V1    V2    V3   
  <chr> <chr> <chr>
1 a     d     w    
2 b     d     w    
3 c     e     t    
4 a     d     w    
5 b     f     t    
6 c     g     t    
7 a     h     w    
8 b     k     w    
9 c     e     t 
0 голосов
/ 24 августа 2018

Опция, использующая data.table, будет

library(data.table)
setDT(data1)[data2, V3 := i.V3, on = .(V1, V2)]
data1
#   V1 V2 V3
#1:  a  d  w
#2:  b  d  w
#3:  c  e  t
#4:  a  d  w
#5:  b  f  t
#6:  c  g  t
#7:  a  h  w
#8:  b  k  w
#9:  c  e  t

данные

data1 <- structure(list(V1 = c("a", "b", "c", "a", "b", "c", "a", "b", 
"c"), V2 = c("d", "d", "e", "d", "f", "g", "h", "k", "e"), V3 = c("t", 
"w", "t", "t", "w", "t", "w", "w", "w")), row.names = c(NA, -9L
), class = "data.frame")

data2 <- structure(list(V1 = c("a", "b", "c"), V2 = c("d", "f", "e"), 
V3 = c("w", "t", "t")), row.names = c(NA, -3L), class = "data.frame")
0 голосов
/ 24 августа 2018

Попробуйте это решение

Ваши кадры данных

data1<-data.frame(V1=c("a","b","c","a","b","c","a","b","c"),
V2=c("d","d","e","d","f","g","h","k","e"),
V3=c("t","w","t","t","w","t","w","w","w"))

data2<-data.frame(V1=c("a","b","c"),
                  V2=c("d","f","e"),
                  V3=c("w","t","t"))

объедините их, используя столбцы V1 и V2

library("dplyr")
data3<-left_join(data1,data2,by=c("V1","V2"))
data3
  V1 V2 V3.x V3.y
1  a  d    t    w
2  b  d    w <NA>
3  c  e    t    t
4  a  d    t    w
5  b  f    w    t
6  c  g    t <NA>
7  a  h    w <NA>
8  b  k    w <NA>
9  c  e    w    t

Подстановка соответствующих значений

data3[!is.na(data3[,4]),3]<-data3[!is.na(data3[,4]),4]

Ваш вывод

data3[,-4]
  V1 V2 V3.x
1  a  d    w
2  b  d    w
3  c  e    t
4  a  d    w
5  b  f    t
6  c  g    t
7  a  h    w
8  b  k    w
9  c  e    t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...