объединить два data.frames и заменить значения определенных столбцов df1 на значения df2

У меня есть два data.frames, которые я хочу объединить и заменить значения определенных столбцов df1 значениями df2. в этом рабочем примере всего 3 столбца. но в исходных данных в окончательном data.frame должно остаться около 20 столбцов.

NO <- c(2, 4, 7, 18, 25, 36, 48)
WORD <- c("apple", "peach", "plum", "orange", "grape", "berry", "pear")
CLASS <- c("p", "x", "x", "n", "x", "p", "n")
ColA <- c("hot", "warm", "sunny", "rainy", "windy", "cloudy", "snow")
df1 <- data.frame(NO, WORD, CLASS, ColA)
df1

#   NO   WORD CLASS   ColA
# 1  2  apple     p    hot
# 2  4  peach     x   warm
# 3  7   plum     x  sunny
# 4 18 orange     n  rainy
# 5 25  grape     x  windy
# 6 36  berry     p cloudy
# 7 48   pear     n   snow

NO <- c(4, 18, 36)
WORD <- c("patricia", "oliver", "bob")
CLASS <- c("p", "n", "x")

df2 <- data.frame(NO, WORD, CLASS)
df2

#   NO     WORD CLASS
# 1  4 patricia     p
# 2 18   oliver     n
# 3 36      bob     x

Я хочу объединить два data.frames и заменить значения WORD и CLASS из df1 значениями WORD и CLASS из df2

мой data.frame должен выглядеть так:

#   NO      WORD CLASS   ColA
# 1  2     apple     p    hot
# 2  4  patricia     p   warm
# 3  7      plum     x  sunny
# 4 18    oliver     n  rainy
# 5 25     grape     x  windy
# 6 36       bob     x cloudy
# 7 48      pear     n   snow

person cptn    schedule 09.03.2014    source источник
comment
это может помочь. stackoverflow .com / questions / 49417517 /   -  person Ferroao    schedule 28.03.2018


Ответы (2)


Попробуй это

auxind<-match(df2$NO, df1$NO)  # Stores the repeated rows in df1
dfuni<-(rbind(df1[,1:3],df2)[-auxind,])  # Merges both data.frames and erases the repeated rows from the first three colums of df1
dfuni<-dfuni[order(dfuni$NO),] # Sorts the new data.frame
df1[,1:3]<-dfuni 
person Rufo    schedule 09.03.2014
comment
проблема в том, что у меня 20 столбцов в df1, но только три столбца в df2, поэтому я получаю сообщение об ошибке из-за разного количества столбцов! ты знаешь, как я могу это исправить? - person cptn; 09.03.2014
comment
Я отредактировал свой ответ. Теперь вы работаете только с первыми тремя столбцами, а затем подставляете их в исходный df1. - person Rufo; 09.03.2014
comment
ну, похоже, это сработало, но в том же наборе данных со значениями NA я получаю ошибку: Ошибка в xj [i]: только 0 могут быть смешаны с отрицательными индексами! Что это значит? - person cptn; 09.03.2014
comment
Я не уверен. Не могли бы вы привести пример, который генерирует эту ошибку? - person Rufo; 10.03.2014
comment
я исправил проблему! благодарю вас! это как-то связано с факторами! если я добавил stringsAsFactors = FALSE, это сработало! - person cptn; 10.03.2014

Этот подход также может сработать, хотя это больше игра, чем лучший ответ на вопрос:

library(qdap); library(qdapTools)
df1[, 2] <- as.character(df1[, 2])
trms <- strsplit(df1[, 1] %lc% colpaste2df(df2, 2:3, keep.orig = FALSE), "\\.")
df1[sapply(trms, function(x) !all(is.na(x))), 2:3] <- 
    do.call(rbind, trms[sapply(trms, function(x) !all(is.na(x)))])
person Tyler Rinker    schedule 24.05.2014