R 如何找到&;基于另一个表中的值替换表中的值
如果匹配DF1$group=DF2$group,我想用DF1$Value查找并替换DF1$Value中的值R 如何找到&;基于另一个表中的值替换表中的值,r,R,如果匹配DF1$group=DF2$group,我想用DF1$Value查找并替换DF1$Value中的值 DF1 group Value 12357 ABC D 12575 GHI JK 19718 LMN O 19716 LMN OP 18947 QR S TV DF2 group Value 12357 ABCD 12575 GHIJK 19718 LMNO 18947 QR
DF1
group Value
12357 ABC D
12575 GHI JK
19718 LMN O
19716 LMN OP
18947 QR S TV
DF2
group Value
12357 ABCD
12575 GHIJK
19718 LMNO
18947 QR STV
我怎样用R写这句话?
提前感谢这里有一个使用
dplyr
包的解决方案,您可能需要将值列从因子转换为字符
library(dplyr)
DF1$Value <- as.character(DF1$Value)
DF2$Value <- as.character(DF2$Value)
merge(DF1, DF2, by = "group", all.x = T) %>%
mutate(Value = ifelse(!is.na(Value.y), Value.y, Value.x)) %>%
select(group, Value)
group Value
1 12357 ABCD
2 12575 GHIJK
3 18947 QR STV
4 19716 LMN OP
5 19718 LMNO
库(dplyr)
DF1美元价值%
选择(组、值)
组值
112357 ABCD
212575吉吉克
3 18947 QR STV
419716 LMN OP
519718 LMNO
这是一个带有dplyr
包的解决方案,您可能需要将值列从因子转换为字符
library(dplyr)
DF1$Value <- as.character(DF1$Value)
DF2$Value <- as.character(DF2$Value)
merge(DF1, DF2, by = "group", all.x = T) %>%
mutate(Value = ifelse(!is.na(Value.y), Value.y, Value.x)) %>%
select(group, Value)
group Value
1 12357 ABCD
2 12575 GHIJK
3 18947 QR STV
4 19716 LMN OP
5 19718 LMNO
库(dplyr)
DF1美元价值%
选择(组、值)
组值
112357 ABCD
212575吉吉克
3 18947 QR STV
419716 LMN OP
519718 LMNO
这里有一个基本R
选项,带有匹配
i1 <- with(DF1, match(group, DF2$group))
DF1$Value <- with(DF1, ifelse(is.na(i1), Value, DF2$Value[i1]))
DF1
# group Value
#1 12357 ABCD
#2 12575 GHIJK
#3 19718 LMNO
#4 19716 LMN OP
#5 18947 QR STV
i1这里有一个base R
选项,带有match
i1 <- with(DF1, match(group, DF2$group))
DF1$Value <- with(DF1, ifelse(is.na(i1), Value, DF2$Value[i1]))
DF1
# group Value
#1 12357 ABCD
#2 12575 GHIJK
#3 19718 LMNO
#4 19716 LMN OP
#5 18947 QR STV
i1这里有一个使用merge
的基本解决方案:
transform(merge(df1,df2, by='group', all.x=TRUE),
Value = ifelse(is.na(Value.y), Value.x, Value.y)
)[c('group','Value')]
## group Value
## 1 12357 ABCD
## 2 12575 GHIJK
## 3 18947 QR STV
## 4 19716 LMN OP
## 5 19718 LMNO
这假设您在df1
和df2
中有character
值。否则,您需要将Value.x
和Value.y
包装为as.character
:
... ifelse(is.na(Value.y), as.character(Value.x), as.character(Value.y)) ...
下面是一个使用merge
的基本解决方案:
transform(merge(df1,df2, by='group', all.x=TRUE),
Value = ifelse(is.na(Value.y), Value.x, Value.y)
)[c('group','Value')]
## group Value
## 1 12357 ABCD
## 2 12575 GHIJK
## 3 18947 QR STV
## 4 19716 LMN OP
## 5 19718 LMNO
这假设您在df1
和df2
中有character
值。否则,您需要将Value.x
和Value.y
包装为as.character
:
... ifelse(is.na(Value.y), as.character(Value.x), as.character(Value.y)) ...
当然还有一个data.table
解决方案
library(data.table)
setDT(DF1)
setDT(DF2)
DF1[ DF2, on = c("group"), Value := i.Value]
## here the 'Value' of DF1 is being updated with the 'Value' of DF2
## where there is a common 'group' value between the two tables.
DF1
group Value
1: 12357 ABCD
2: 12575 GHIJK
3: 19718 LMNO
4: 19716 LMN OP
5: 18947 QR STV
当然还有一个data.table
解决方案
library(data.table)
setDT(DF1)
setDT(DF2)
DF1[ DF2, on = c("group"), Value := i.Value]
## here the 'Value' of DF1 is being updated with the 'Value' of DF2
## where there is a common 'group' value between the two tables.
DF1
group Value
1: 12357 ABCD
2: 12575 GHIJK
3: 19718 LMNO
4: 19716 LMN OP
5: 18947 QR STV