我想替换/更新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中显示的列,因此无法更新。
答案 0 :(得分:0)
找到匹配的行。改变价值观。
rows <- originalDF$cars %in% newDF$cars
originalDF[rows, -1] <- newDF[, -1]
请注意,上述内容假设originalDF
和newDF
的列顺序相同。如果无法保证,请使用正确的列名替换-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),但是在这里我们决定更新originalDF
和newDF
的所有公共列。
最终,mget
将在右表上检索这些列的内容(这就是i
所指,data.table
的一般语法是dt[i,j,group]
,其中i
基本上定义了受影响的行,j
哪些列以及group
应该如何汇总行)。