【问题标题】:Convert xyz dataframe to matrix in base R将 xyz 数据帧转换为基础 R 中的矩阵
【发布时间】:2020-11-26 16:35:25
【问题描述】:

我想将数据框转换为矩阵。

我成功使用了reshape2 包中的acast 函数,但想知道如何在base R 中执行此操作。

# Create data
set.seed(123)
df <- tidyr::expand_grid(x = c(1,2,3), y = c(0,-0.5,-1))
df <- cbind(df, z=rnorm(9))

# Convert dataframe to matrix
example_matrix <- reshape2::acast(df, x~y, value.var="z")

问题

reshape2acast 函数的基本 R 替代方案是什么?

【问题讨论】:

    标签: r dataframe matrix


    【解决方案1】:

    我猜你可以这样做:

    do.call(rbind, lapply(split(df, df$x), function(d) `names<-`(d$z, d$y)))[,3:1]
    #>           -1       -0.5           0
    #> 1  1.5587083 -0.2301775 -0.56047565
    #> 2  1.7150650  0.1292877  0.07050839
    #> 3 -0.6868529 -1.2650612  0.46091621
    

    【讨论】:

    • [,length(unique(df$x)):1]替换[,3:1]可能更通用
    • @user213544 是的,当然 - 我太喜欢在没有滚动条的情况下放在一行的解决方案!
    【解决方案2】:

    一个更通用的实现(不像acast那么通用)。

    baseAcast<-function(df, dimval=c("x","y"), value.var="z", fill=NA) {
        uniqueValues<-lapply(df[dimval], function(x) sort(unique(x)))
        indices<-Map(match,df[dimval],uniqueValues)
        ret<-array(fill,lengths(uniqueValues),dimnames=unname(uniqueValues))
        indicesMat<-do.call(cbind,indices)
        ret[indicesMat]<-df[[value.var]]
        ret
    }
    
    baseAcast(df)
    #          -1       -0.5           0
    #1  1.5587083 -0.2301775 -0.56047565
    #2  1.7150650  0.1292877  0.07050839
    #3 -0.6868529 -1.2650612  0.46091621
    

    【讨论】:

      【解决方案3】:

      另一种方式:

      sapply(split(df, df$y), function(d) setNames(d$z, d$x))
      #>           -1       -0.5           0
      #> 1  1.5587083 -0.2301775 -0.56047565
      #> 2  1.7150650  0.1292877  0.07050839
      #> 3 -0.6868529 -1.2650612  0.46091621
      

      【讨论】:

        【解决方案4】:

        如果我们没有重复,那么使用来自base Rxtabs 会更容易

        xtabs(z ~ x + y, df)
        

        -输出

        #y
        #x            -1        -0.5           0
        #  1  1.55870831 -0.23017749 -0.56047565
        #  2  1.71506499  0.12928774  0.07050839
        #  3 -0.68685285 -1.26506123  0.46091621
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-02
          相关资源
          最近更新 更多