在没有for循环的情况下更新R中的数据帧

在没有for循环的情况下更新R中的数据帧,r,dataframe,match,apply,R,Dataframe,Match,Apply,我有一个主数据帧df: df <- data.frame(c("A", "B", "C"), c(1,2,3), c(3,1,2), c(4,2,1), rep(NA, 3), rep(NA, 3)) colnames(df) <- c("text", "var1", "var2", "var3", "value1", "value2") 我想匹配列“var1”、“var2”、“var3”,并更新列“value1”和“value2”。因此df.upd的第1行和第2行将df的第1行和

我有一个主数据帧
df

df <- data.frame(c("A", "B", "C"), c(1,2,3), c(3,1,2), c(4,2,1), rep(NA, 3), rep(NA, 3))
colnames(df) <- c("text", "var1", "var2", "var3", "value1", "value2")
我想匹配列“var1”、“var2”、“var3”,并更新列“value1”和“value2”。因此
df.upd
的第1行和第2行将
df
的第1行和第2行更新为.numeric(df.upd[row x,1:3])==as.numeric(df[row y,2:4])必须是
TRUE


主df大约有30k行和60列,因此for循环不是一个选项。你知道如何更快地完成吗

这是一个for循环答案,但它仍然可能有用且快速,因为过程是矢量化的

ind <- intersect(names(df), names(df.upd))
for (i in ind) {
  df[1:length(df.upd[,i]),i]  <- df.upd[,i]
}

ind您可以使用
merge
all.x=TRUE
(左连接),然后使用
ifelse
is.na
更新相关列,然后删除额外列check out。。。i、 e.
库(数据表);科尔斯
ind <- intersect(names(df), names(df.upd))
for (i in ind) {
  df[1:length(df.upd[,i]),i]  <- df.upd[,i]
}