基于来自其他数据帧的匹配值在数据框中创建新变量

时间:2018-04-26 15:22:02

标签: r pattern-matching

我有两个数据帧,df1和df2,其中两列具有部分匹配的值,但是顺序完全不同;此外,这些值在df2中是唯一的,但可以在df1中重复。 我想要做的是转移到df1,而不是匹配的值,而是转移到df2中另一个变量中与它们相关的值;对于df1中的一个值," G",我不希望转移相关值,而只是转移NA。

考虑df1和df2:

df1 <- data.frame(
  x = c("A", NA, "L", "G", "C", "F", NA, "J", "G", "K")
)

df2 <- data.frame(
  a = LETTERS[1:10],
  b = 1:10   # these are the values to be transferred into df1$z
)

df1$z <- ifelse(df1$x=="G", NA, ifelse(df1$x %in% df2$a, df2$b[df2$a %in% df1$x], NA))

从df2传输到df1的值在df2 $ b中。我已经尝试了上面的ifelse()字符串,但是df1 $ z中的结果值只是部分正确。哪里出错?

2 个答案:

答案 0 :(得分:0)

我认为这可以满足您的需求:

df1$z <- df2$b[match(df1$x,df2$a)]
df1$z[df1$x=='G']=NA

输出:

> df1
      x  z
1     A  1
2  <NA> NA
3     L NA
4     G  7
5     C  3
6     F  6
7  <NA> NA
8     J 10
9     G  7
10    K NA

希望这有帮助!

答案 1 :(得分:0)

dplyr::left_join(df1,df2,by=c("x"="a")) %>% mutate(b = ifelse(x=="G",NA,b))

#       x  b
# 1     A  1
# 2  <NA> NA
# 3     L NA
# 4     G NA
# 5     C  3
# 6     F  6
# 7  <NA> NA
# 8     J 10
# 9     G NA
# 10    K NA