合并数据框和命名向量

11

我有一个数据框和一个命名向量:

df=data.frame(col1=letters[1:3],col2=rnorm(3))
v=c(a=2,b=4,c=56,d=65)
我希望将它们合并,并只保留数据框中的值。
v=data.frame(v)
merge(df,v,by.x='col1',by.y=row.names,all.x=TRUE)
Error in as.vector(x, mode) : 
  cannot coerce type 'closure' to vector of type 'any'

我想要:

  col1   rnorm.3.  v
1    a  0.6182781  2
2    b  0.9559001  4
3    c -0.5459661 56

请注意,我的真实数据有1百万行和1.5百万个带名称的向量。

2个回答

18

我们可以使用match函数将col1v中的names进行匹配。

df$v <- v[match(df$col1, names(v))]
df

#  col1       col2  v
#1    a  0.6658478  2
#2    b -1.6029447  4
#3    c  0.9019324 56

@Frank在评论中提出了一种更简单的方法,

df$v <- v[df$col1]

10

我们可以创建一个包含向量名称的列,并进行合并merge

merge(df, data.frame(v, col1 = names(v)), all.x = TRUE)
#   col1        col2  v
#1    a -1.61035092  2
#2    b -0.04848256  4
#3    c  2.74926847 56

在OP的代码中,by.y 中的 row.names 应该加上引号。

merge(df, data.frame(v), by.x = "col1", by.y = "row.names")
#  col1        col2  v
#1    a -1.61035092  2
#2    b -0.04848256  4
#3    c  2.74926847 56
或者使用tidyverse中的left_join
library(tidyverse)
left_join(df, data.frame(v, col1 = names(v)))

3
使用 data.table,可以通过 setDT(df); df[stack(v), on=.(col1=ind), v := i.values][] 实现相同功能。 - Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接