使用来自另一个data.frame的数据和条件修改data.frame列

时间:2018-06-11 10:02:52

标签: r dplyr data.table

我有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?

2 个答案:

答案 0 :(得分:1)

您可以使用left_join

mutatedplyr的组合

修改

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