我有2个data.frames
df <- data.frame(addr=c('a','b','c','d'), num = c(1,2,3,4))
> df
addr num
1 a 1
2 b 2
3 c 3
4 d 4
df2 <- data.frame(addr=c('a','b','d'), num=c(100,200,500))
> df2
addr num
1 a 100
2 b 200
3 d 500
如果条件df $ addr与df2 $ addr匹配,我想用df2 $ num中的值替换df $ num中的值。我设法通过以下代码获得了这个
df[,"num"] <- sapply(df[,"addr"], function(x) ifelse(x %in% df2$addr,df2$num[match(x,df2$addr)],df[df$addr==x,]$num))
> df
addr num
1 a 100
2 b 200
3 c 3
4 d 500
我想知道是否有更优雅的方法使用dplyr或data.table?
答案 0 :(得分:1)
您可以使用left_join
mutate
和dplyr
的组合
library(dplyr)
df3 <- df %>%
left_join(df2, by = "addr") %>%
mutate(num = ifelse(.$num.y %in% df2$num, .$num.y, df$num)) %>%
select(addr, num)
df3
# addr num
#1 a 100
#2 b 200
#3 c 3
#4 d 500
旧回答
df3 <- df %>%
mutate(num = ifelse(addr %in% df2$addr, df2$num, num))
df3
# addr num
#1 a 100
#2 b 200
#3 c 3
#4 d 100
答案 1 :(得分:0)
您可以合并两个表并选择所需的列:
merge(df,df2,'addr',all = T)
# addr num.x num.y
#1 a 1 100
#2 b 2 200
#3 c 3 NA
#4 d 4 500