2016-05-20 4 views
0

Я хочу, чтобы заменить «O» в таблице t1 с таблицей t2 с помощью «Объединить»:Как заменить определенные записи в таблице другой таблицей, используя «merge»?

t1<-data.frame(x1=c(1,2,3,4,5),x2=c("a","O","O","b","a")) 
t2<-data.frame(x1=c(2,3),x2=c("a","b")) 
first <- merge(t1["x2"=="O",],t2,by="x1") 

Результат должен был быть таким:

t1<-data.frame(x1=c(1,2,3,4,5),x2=c("a","a","b""b","a")) 

Но я не понял ,

В чем проблема?

+1

Это на самом деле не присоединиться; более простой подход состоял бы в том, чтобы назначить подмножество: 't1 [t1 $ x2 == 'O',] <- t2' – alistaire

+2

' subset (merge (t1, t2, all = TRUE), x2! = "O") ' – thelatemail

+0

@ alistaire @ thelatemail Спасибо! Это к делу! –

ответ

0

Возможно, это может быть очищено. Это использует dplyr пакет

first = left_join(t1, t2, by = "x1") %>% 
    mutate(x2 = ifelse(x2.x == "O", as.character(x2.y), as.character(x2.x))) %>% 
    select(x1, x2) 
+0

У меня просто проблема с загрузкой «dplyr», возможно, из системы win10. –

+0

Какова конкретная ошибка – zacdav

+1

@JadaChang Угадайте, но убедитесь, что файл, который '.libPaths()' указывает, доступен для записи; многие пользователи Windows, похоже, имеют проблемы с правами по умолчанию. – alistaire

2

Я думаю merge грязен здесь (и я бы не стал возиться с этим "O" кодирования). Вы можете сделать

m = match(t1$x1, t2$x1) 
t1$x2[ !is.na(m) ] <- t2$x2[ m[!is.na(m)] ] 

Это не распространяется на объединение более чем одного столбца, поэтому я бы рекомендовал data.table:

library(data.table) 
setDT(t1)[t2, on="x1", x2 := i.x2] 
+0

Спасибо! Это полезно! –

Смежные вопросы