合并数据框和命名向量

ale*_*lex 4 merge r vector

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

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

我们可以matchcol1namesv

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)


akr*_*run 7

我们可以使用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.namesby.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_jointidyverse

library(tidyverse)
left_join(df, data.frame(v, col1 = names(v)))
Run Code Online (Sandbox Code Playgroud)

  • 或者使用data.table`setDT(df); df [stack(v),on =.(col1 = ind),v:= i.values] []` (3认同)