我有一个如下所示的数据框:
n <- c("foo","bar","qux","qux","bar")
k <- c(100,200,300,400,500)
z <- c("z","w","x","y","v")
df1 <- data.frame(n,k,z)
df1
n k z
1 foo 100 z
2 bar 200 w
3 qux 300 x
4 qux 400 y
5 bar 500 v
给出第二个数据框
l <- c("k1","k2","k3","k4","k5")
n2 <- c("foo","bar","qux","qux","bar") # name difference of (n2) is intentional
df2 <- data.frame(n2,l)
n2 l
1 foo k1
2 bar k2
3 qux k3
4 qux k4
5 bar k5
我想创建具有以下条件的第三个数据框:
使用
df1
作为来源来创建第三个数据框和 对于df1
中<{1}}的 n2 ,每行检查参考 n 。
所以最后我想要这个:
df2
这样做的方法是什么?
答案 0 :(得分:3)
我认为您正在寻找match
:
匹配返回其(第一)匹配位置的向量 第二个论点。
m <- df1
cbind(m,call=df2$l[match(df1$n ,df2$n2)])
n k z call
1 foo 100 z k1
2 bar 200 w k2
3 qux 300 x k3
4 qux 400 y k3
5 bar 500 v k2
另一种选择是使用merge
,但您应该删除重复的内容:
hh <- merge(df1,df2,by.x='n',by.y='n2')
hh[!duplicated(hh[,1:3]),]
n k z l
1 bar 200 w k2
3 bar 500 v k2
5 foo 100 z k1
6 qux 300 x k3
8 qux 400 y k3