我有一个数据框和一个名称向量:
df=data.frame(col1=letters[1:3],col2=rnorm(3))
v=c(a=2,b=4,c=56,d=65)
Run Code Online (Sandbox Code Playgroud)
我想合并它们,并只保留数据框中的值
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'
Run Code Online (Sandbox Code Playgroud)
我想要:
col1 rnorm.3. v
1 a 0.6182781 2
2 b 0.9559001 4
3 c -0.5459661 56
Run Code Online (Sandbox Code Playgroud)
注意我的真实数据是1M行和1.5M命名向量
Ron*_*hah 10
我们可以match
的col1
带names
的v
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
Run Code Online (Sandbox Code Playgroud)
@Frank在评论中采用更简单的方法,
df$v <- v[df$col1]
Run Code Online (Sandbox Code Playgroud)
我们可以使用names
向量创建一个列并执行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
Run Code Online (Sandbox Code Playgroud)
在OP的代码中,row.names
在by.y
应该在报价
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
Run Code Online (Sandbox Code Playgroud)
或者使用left_join
从tidyverse
library(tidyverse)
left_join(df, data.frame(v, col1 = names(v)))
Run Code Online (Sandbox Code Playgroud)