【问题标题】:How to convert a data frame to a 3d array in R如何将数据框转换为 R 中的 3d 数组
【发布时间】:2013-10-23 05:30:58
【问题描述】:

我有一个要转换为三维数组的数据框。数据框中的一列应用作分组变量,用于将帧拆分为可组合成数组的二维矩阵。在下面的最小工作示例中,数据帧应由变量“i”拆分为矩阵,然后组合成一个 4x4x2 数组。该解决方案应该适用于大型数据集,理想情况下可以推广到将数据帧转换为 n 维数组。

# Make reproducible 
set.seed(123)

df <- {
  data.frame(i=rep(1:2, each=4),
             x=rep(rep(0:1, each=2), 2),
             y=rep(rep(0:1, 2), 2),
             l=rnorm(8))
}

df
#   i x y           l
# 1 1 0 0 -0.56047565
# 2 1 0 1 -0.23017749
# 3 1 1 0  1.55870831
# 4 1 1 1  0.07050839
# 5 2 0 0  0.12928774
# 6 2 0 1  1.71506499
# 7 2 1 0  0.46091621
# 8 2 1 1 -1.26506123

注意:我怀疑 Hadley Wickham 的 plyr 可能会提供所需的工具,也许是 daply?

【问题讨论】:

  • 您只是在寻找split(df, df$i)吗?
  • 我在寻找 abind(split(df, df$i), along=3)。你已经成功了一半。
  • 发布了另一种选择,只是为了多样化。

标签: arrays r


【解决方案1】:

我可能会这样做:

library(abind)
abind(split(df, df$i), along=3)
# , , 1
# 
#   i x y           l
# 5 1 0 0 -0.56047565
# 6 1 0 1 -0.23017749
# 7 1 1 0  1.55870831
# 8 1 1 1  0.07050839
# 
# , , 2
# 
#   i x y          l
# 5 2 0 0  0.1292877
# 6 2 0 1  1.7150650
# 7 2 1 0  0.4609162
# 8 2 1 1 -1.2650612

【讨论】:

    【解决方案2】:

    听起来你在找split

    > split(df, df$i)
    $`1`
      i x y           l
    1 1 0 0 -0.56047565
    2 1 0 1 -0.23017749
    3 1 1 0  1.55870831
    4 1 1 1  0.07050839
    
    $`2`
      i x y          l
    5 2 0 0  0.1292877
    6 2 0 1  1.7150650
    7 2 1 0  0.4609162
    8 2 1 1 -1.2650612
    

    这会导致两个 data.frames 中的 list 由“i”列分隔。


    要获得array,您可以使用 Josh 的答案,或者您可以使用 base R 中的simplify2array

    > simplify2array(by(df, df$i, as.matrix))
    , , 1
    
      i x y           l
    1 1 0 0 -0.56047565
    2 1 0 1 -0.23017749
    3 1 1 0  1.55870831
    4 1 1 1  0.07050839
    
    , , 2
    
      i x y          l
    1 2 0 0  0.1292877
    2 2 0 1  1.7150650
    3 2 1 0  0.4609162
    4 2 1 1 -1.2650612
    

    【讨论】:

      【解决方案3】:

      也许我读错了问题,但 MWE 描述了一个 2x2x2 数组(x、y、i(又名 z))。当前的答案似乎提供了提供 data.frames 数组而不是 2D 矩阵数组(每个 OP)的解决方案。 array() 会将 data.frame 转换为 n 维矩阵数组:

      dfa <- array(data = df$l, 
                   dim=c(length(unique(df$x)), 
                         length(unique(df$y)), 
                         length(unique(df$i))), 
                   dimnames=list(unique(df$x), unique(df$y), unique(df$i))
                  )
      dfa
      > dfa
      , , 1
      
                 0          1
      0 -0.5604756 1.55870831
      1 -0.2301775 0.07050839
      
      , , 2
      
                0          1
      0 0.1292877  0.4609162
      1 1.7150650 -1.2650612
      

      【讨论】:

      • 好点@Brian D。上面的答案并不是真正的矩阵。
      猜你喜欢
      • 2019-02-11
      • 2016-06-02
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      相关资源
      最近更新 更多