【问题标题】:merge two data.frames and replace values of certain columns of df1 with values of df2合并两个data.frames并将df1的某些列的值替换为df2的值
【发布时间】:2014-04-12 14:18:18
【问题描述】:

我有两个 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 并替换 df1 中的 WORD 和 CLASS 的值 使用 df2 中的 WORD 和 CLASS 的值

我的 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

【问题讨论】:

标签: r replace merge tm


【解决方案1】:

试试这个

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 

【讨论】:

  • 问题是,我在 df1 中有 20 列,但在 df2 中只有三列,所以由于列数不同而出现错误!你知道我该如何解决吗?
  • 我已经编辑了我的答案。现在您只使用前三个列,然后将它们替换为原始的 df1
  • 它似乎有效,但在具有“NA”值的同一数据集上,我收到错误:xj[i] 中的错误:只有 0 可能与负下标混合!这是什么意思?
  • 我不确定。您能否提供一个产生此错误的示例?
  • 我解决了这个问题!谢谢!跟因素有关!如果我添加了 stringsAsFactors = FALSE 它就起作用了!
【解决方案2】:

这种方法也可以奏效,尽管比问题的最佳答案更多:

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)))])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2021-11-27
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多