【问题标题】:merge data frame and named vector合并数据框和命名向量
【发布时间】:2018-08-17 13:54:46
【问题描述】:

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

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

注意我的真实数据是 1M 行和 1.5M 命名向量

【问题讨论】:

    标签: r vector merge


    【解决方案1】:

    我们可以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
    

    @Frank 在 cmets 中的一种更简单的方法,

    df$v <- v[df$col1]
    

    【讨论】:

      【解决方案2】:

      我们可以使用向量的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
      

      在 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
      

      或者使用left_join 来自tidyverse

      library(tidyverse)
      left_join(df, data.frame(v, col1 = names(v)))
      

      【讨论】:

      • 或者用data.table setDT(df); df[stack(v), on=.(col1=ind), v := i.values][]
      猜你喜欢
      • 2018-05-27
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多