与另一个数据帧值相匹配的值在数据帧和替换前者与来自其它数据帧中的对应图案(Match values

2019-06-17 11:39发布

复杂的标题,但这里是什么,我想实现一个简单的例子:

d <- data.frame(v1 = c(1,2,3,4,5,6,7,8), 
                v2 = c("A","E","C","B","B","C","A","E"))

m <- data.frame(v3 = c("D","E","A","C","D","B"), 
                v4 = c("d","e","a","c","d","b"))

在值d$v2应该由值替换m$v4从价值观匹配d$v2m$v3

将得到的数据帧d应为:

v1    v4
1      a
2      e
3      c
4      b
5      b
6      c
7      a
8      e

我尝试不同的东西,我来最接近的是: d$v2 <- m$v4[which(m$v3 %in% d$v2)]

我尽量避免任何一次for循环! 必须能够:-)莫名其妙...;)

Answer 1:

你可以试试:

merge(d,m, by.x="v2", by.y="v3")
  v2 v1 v4
1  A  1  a
2  A  7  a
3  B  4  b
4  B  5  b
5  C  3  c
6  C  6  c
7  E  2  e
8  E  8  e

编辑

这是另一种方法,以保持顺序:

data.frame(v1=d$v1, v4=m[match(d$v2, m$v3), 2])
  v1 v4
1  1  a
2  2  e
3  3  c
4  4  b
5  5  b
6  6  c
7  7  a
8  8  e


Answer 2:

你可以使用一个标准的左连接。

加载数据:

d <- data.frame(v1 = c(1,2,3,4,5,6,7,8), v2 = c("A","E","C","B","B","C","A","E"), stringsAsFactors=F)
m <- data.frame(v3 = c("D","E","A","C","D","B"), v4 = c("d","e","a","c","d","b"), stringsAsFactors=F)

更改列名,这样我可以通过柱“V2”加盟

colnames(m) <- c("v2", "v4")

左连接和保持data.frame d的顺序

library(dplyr)
left_join(d, m)

输出:

  v1 v2 v4
1  1  A  a
2  2  E  e
3  3  C  c
4  4  B  b
5  5  B  b
6  6  C  c
7  7  A  a
8  8  E  e


Answer 3:

这会给你所需的输出:

d$v2 <- m$v4[match(d$v2, m$v3)]

匹配函数返回从米矩阵的列V3在值的位置d$v2被匹配。 一旦获得了索引(使用match()中,从接入元件m$v4使用这些索引,以取代在d矩阵,列v2中的元素。



文章来源: Match values in data frame with values in another data frame and replace former with a corresponding pattern from the other data frame