【问题标题】:Updating dataframe in R without for loop在没有for循环的情况下更新R中的数据框
【发布时间】:2018-11-02 03:04:57
【问题描述】:

我有一个主数据框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")

还有另一个带有新信息的数据框df.upd

df.upd <- data.frame(c(1,2), c(3,1), c(4,2),c(0.5, 0.6), c(12, 20))                           
colnames(df.upd) <- c("var1", "var2", "var3", "value1", "value2")
> df
text var1 var2 var3 value1 value2
1    A    1    3    4     NA     NA
2    B    2    1    2     NA     NA
3    C    3    2    1     NA     NA
> df.upd
  var1 var2 var3 value1 value2
1    1    3    4    0.5     12
2    2    1    2    0.6     20

我想匹配列“var1”、“var2”、“var3”并更新列“value1”和“value2”。所以df.upd的第1行和第2行将更新df的第1行和第2行,所以as.numeric(df.upd[row x, 1:3])==as.numeric(df[row y, 2:4])必须是TRUE

主 df 有大约 30k 行和 60 列,因此不能选择 for 循环。知道如何更快地完成这项工作吗?

【问题讨论】:

  • 您可以使用mergeall.x = TRUE(左连接),然后使用ifelseis.na 来更新相关列,然后删除额外的列
  • 签出stackoverflow.com/questions/36347213/…...即library(data.table); cols &lt;- paste0('value', 1:2); setDT(df)[setDT(df.upd), (cols) := mget(paste0("i.", cols)), on=.(var1, var2, var3)]

标签: r dataframe match apply


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-07-02
    • 1970-01-01
    • 2014-03-13
    • 2013-09-20
    • 2021-11-12
    • 2014-02-23
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    相关资源
    最近更新 更多