我正在试图弄清楚如何使用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()
函数来更新值c
和d
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.x
和value.y
而只保留了原始列value
是否有这样做的一个简单的方法?
最佳解决方案使用 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.
前缀在参数中引用表中的列。
并不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)