替换R data.frame中的值

时间:2013-10-07 13:57:55

标签: r replace dataframe

我想替换/更新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中显示的列,因此无法更新。

2 个答案:

答案 0 :(得分:0)

找到匹配的行。改变价值观。

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

请注意,上述内容假设originalDFnewDF的列顺序相同。如果无法保证,请使用正确的列名替换-1中的[, ]

答案 1 :(得分: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)]设置密钥。

在加入过程中,由于操作员:=,我们可以在原始字段(左侧的表格)上即时修改字段。我们可能会创建一个新列(originalDF[newDF, new_column := new_value],空值为NA),但是在这里我们决定更新originalDFnewDF的所有公共列。

最终,mget将在右表上检索这些列的内容(这就是i所指,data.table的一般语法是dt[i,j,group],其中i基本上定义了受影响的行,j哪些列以及group应该如何汇总行)。