0

我想替换/更新 R data.frame 中的值,请参见下面的示例:

原始 data.frame originalDF 包含汽车、价格和尺寸列:

    cars <- c("FORD", "GM")
    price <- c(10,  20)
    size <- c(1,2)  
    originalDF <- data.frame(cars=cars, price=cbind(price), size=cbind(size))

    originalDF:
    cars price size
  1 FORD    10    1
  2   GM    20    2

然后我想用(较小的)newDF 中的新值替换/更新 originalDF 中的值,假设 newDF 是单个销售记录:

cars <- "FORD"
price  <- 15
color  <- "white"
newDF <- data.frame(cars=cars, price=cbind(price),color=cbind(color))

newDF:
cars price color
1 FORD    15 white

所以这是我的最终结果。

modifiedDF:
  cars price
1 FORD    15
2   GM    20

请注意,newDF 具有未包含在 originalDF 中且不需要的附加值。同时 originalDF 可能有一些列可能不会出现在 newDF 中,因此无法更新。

4

2 回答 2

0

找到匹配的行。更改值。

rows <- originalDF$cars %in% newDF$cars
originalDF[rows, -1] <- newDF[, -1]

请注意,以上假设originalDF和的列顺序相同newDF。如果不能保证这一点,请将-1in替换[, ]为正确的列名

于 2013-10-07T14:18:01.933 回答
0

使用data.table,您可以很容易地做到这一点:

library(data.table)
# Create your data
originalDF <- data.table(cars=c("FORD", "GM"), price=c(10,  20), size=c(1,2)) %>% setkey(cars)
newDF <- data.table(cars="FORD", price=15, color="white") %>% setkey(cars)
# Update originalDF
originalDF[newDF, intersect(names(originalDF), names(newDF)) := mget(paste0("i.", intersect(names(originalDF), names(newDF))))]

如果您不习惯data.table操作,最后一条指令可能需要一些解释。

originalDF[newDF]只是一个左连接(左表是originalDF)。合并键是在创建表期间使用setkey. 我们也可以用 设置密钥originalDF[newDF, on=.(cars=cars)]

当我们加入时,我们动态修改(在原始左表上)一些字段,这要感谢 operator :=。我们可以创建一个新列(originalDF[newDF, new_column := new_value],空值将是 NA),但在这里我们决定更新originalDF和的所有公共列newDF

最终,mget将检索右表上这些列的内容(这就是i所指的,data.tableis的一般语法dt[i,j,group], where ibeing 基本上定义了哪些行受到影响,j哪些列以及group应如何聚合行)。

于 2019-11-15T10:30:44.817 回答