用另一个data.frame中的值替换data.frame中的值

use*_*782 0 r dataframe

我有两个不同尺寸的数据帧,

df1 <- data.frame(names= sample(LETTERS[1:10]), duration=sample(0:100, 10))

>df1
   names duration
1      J       97
2      G       57
3      H       53
4      A       23
5      E      100
6      D       90
7      C       73
8      F       60
9      B       37
10     I       67

df2 <- data.frame(names= LETTERS[1:5], names_new=letters[1:5])

> df2
  names names_new
1     A         a
2     B         b
3     C         c
4     D         d
5     E         e
Run Code Online (Sandbox Code Playgroud)

我想在更换df1相匹配的价值df1$namesdf2$names但使用df2$names_new.我想要的输出是:

> df1
   names duration
1      J       97
2      G       57
3      H       53
4      a       23
5      e      100
6      d       90
7      c       73
8      F       60
9      b       37
10     I       67
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码,但我想知道是否有更简洁的方法来完成它没有这么多步骤,

df2[,1] <- as.character(df2[,1])
df2[,2] <- as.character(df2[,2])
df1[,1] <- as.character(df1[,1])    

match(df1[,1], df2[,1]) -> id
which(!is.na(id)==TRUE) -> idx
id[!is.na(id)] -> id

df1[idx,1] <- df2[id,2]
Run Code Online (Sandbox Code Playgroud)

非常感谢

Tyl*_*ker 5

这是qdapTools的一种方法:

library(qdapTools)
df1$names <- df1$names %lc+% df2
Run Code Online (Sandbox Code Playgroud)

%l+%是二进制运算符的版本lookup.左边是terms查找表,右边是查找表.这+意味着任何不兼容的产品都将恢复原状.这是data.table包的包装,速度非常快.

这是输出,包括set.seed(1)再现性:

set.seed(1)
df1 <- data.frame(names= sample(LETTERS[1:10]), duration=sample(0:100, 10),stringsAsFactors=F)
df2 <- data.frame(names= LETTERS[1:5], names_new=letters[1:5],stringsAsFactors=F)

library(qdapTools)
df1$names <- df1$names %lc+% df2

df1

##    names duration
## 1      c       20
## 2      d       17
## 3      e       68
## 4      G       37
## 5      b       74
## 6      H       47
## 7      I       98
## 8      F       93
## 9      J       35
## 10     a       71
Run Code Online (Sandbox Code Playgroud)