如何使用merge()更新R中的表

and*_*ewj 19 merge r

我正在试图弄清楚如何使用merge()更新数据库.

这是一个例子.以数据框为例foo

foo <- data.frame(index=c('a', 'b', 'c', 'd'), value=c(100, 101, NA, NA))
Run Code Online (Sandbox Code Playgroud)

其中包含以下值

index value
1     a   100
2     b   101
3     c    NA
4     d    NA
Run Code Online (Sandbox Code Playgroud)

和数据框架 bar

bar <- data.frame(index=c('c', 'd'), value=c(200, 201))
Run Code Online (Sandbox Code Playgroud)

其中包含以下值:

 index value
1     c   200
2     d   201
Run Code Online (Sandbox Code Playgroud)

当我运行下面的merge()函数来更新值cd

merge(foo, bar, by='index', all=T)
Run Code Online (Sandbox Code Playgroud)

它导致此输出:

 index value.x value.y
1     a     100      NA
2     b     101      NA
3     c      NA     200
4     d      NA     201
Run Code Online (Sandbox Code Playgroud)

我想输出的merge()避免的创作,在这个具体的例子中,value.xvalue.y而只保留了原始列value 是否有这样做的一个简单的方法?

jan*_*cki 8

最佳解决方案使用 data.table

library(data.table)
setDT(foo)
setDT(bar)
foo[bar, on="index", value:=i.value]
foo
#   index value
#1:     a   100
#2:     b   101
#3:     c   200
#4:     d   201
Run Code Online (Sandbox Code Playgroud)

[data.table 方法中的第一个参数被命名,i因此我们可以i使用i.前缀在参数中引用表中的列。

  • 如果有多个列需要更新,例如 value1、value2 等,您将如何执行此操作? (2认同)

ape*_*ape 7

并不merge()总是将列绑定在一起?有用replace()吗?

foo$value <- replace(foo$value, foo$index %in% bar$index, bar$value)
Run Code Online (Sandbox Code Playgroud)

或者match()这样的顺序很重要

foo$value[match(bar$index, foo$index)] <- bar$value
Run Code Online (Sandbox Code Playgroud)

  • 使用 `replace()` 的一个问题是,如果 `bar` 中的顺序与 `foo` 中的顺序不同,它将无法正常工作。例如,如果您尝试在 `bar &lt;- bar[c(2,1),]` 之后运行上面的示例,最终结果不会正确。 (2认同)