复杂的标题,但这是我想要实现的一个简单示例:
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$v2
中m$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循环!必须是可能的:-)不知怎的......;)
答案 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列中的元素。