将数据帧中的值与另一个数据帧中的值进行匹配,并将前者替换为另一个数据帧中的相应模式

时间:2012-07-17 20:15:26

标签: r replace pattern-matching dataframe

复杂的标题,但这是我想要实现的一个简单示例:

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循环!必须是可能的:-)不知怎的......;)

3 个答案:

答案 0 :(得分:18)

你可以尝试:

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

答案 1 :(得分:9)

您可以使用标准的左连接。

加载数据:

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

答案 2 :(得分:0)

这将为您提供所需的输出:

<li>
  <a [routerLink]="dashboardUrl" routerLinkActive="active"
     [routerLinkActiveOptions]="{exact: true,__change_detection_hack__:dashboardUrl}">
    Dashboard
  </a>
</li>

match函数从m矩阵的v3列返回位置,以匹配d$v2 <- m$v4[match(d$v2, m$v3)] 中的值。一旦获得了索引(使用d$v2),就可以使用这些索引访问match()中的元素,以替换d矩阵的第v2列中的元素。

相关问题