从数据框到数组,按行

时间:2016-02-17 23:10:33

标签: r dataframe

我有一个数据帧“df”,我想将其转换为数组BY ROW,例如:

> df
    x  y
1   1 21
2   2 22
3   3 23
4   4 24
5   5 25
6   6 26
7   7 27
8   8 28

#Into this array:

> array.df
 , , 1

     [,1] [,2] [,3] [,4]
[1,]   1   21   2   22
[2,]   3   23   4   24

, , 2

     [,1] [,2] [,3] [,4]
[1,]   5   25   6   26
[2,]   7   27   8   28

任何人都可以帮我解决这些问题吗?感谢。

4 个答案:

答案 0 :(得分:1)

相当丑陋的解决方案,但它完成了工作。也许其他人有更好的方法来做到这一点。与此同时,应该这样做。

class Dog{
    public:
        doBark(){}
        doPoop(){}
        doLick(){}
        doWalk(){}
        doRun(){}
        otherFunction(){}
        getAbilities(){}
}

我会尝试解释:

我们的想法是使用install.packages("reshape2") library("reshape2") df x y 1 1 21 2 2 22 3 3 23 4 4 24 5 5 25 6 6 26 7 7 27 8 8 28 myarray <- array(cbind(matrix(melt(t(df))[1:8,3],byrow = T, ncol = 4),matrix(melt(t(df))[9:16,3],byrow = T, ncol = 4)), c(2,4,2)) , , 1 [,1] [,2] [,3] [,4] [1,] 1 21 2 22 [2,] 3 23 4 24 , , 2 [,1] [,2] [,3] [,4] [1,] 5 25 6 26 [2,] 7 27 8 28 转置数据框,然后使用t()包中的melt()函数将其融合。在重新整形数据时,您希望获取第3列,然后逐行创建两个矩阵。然后,您需要将reshape2个矩阵放入一个矩阵中。最后,使用该矩阵通过维度cbind获取所需的数组。

我希望这是有道理的。

答案 1 :(得分:1)

这是另一个不那么优雅的解决方案:

df <- data.frame(x=1:8, y=21:28)
vec <- as.vector(t(df))               # transpose df and then turn into a single vector 
arr <- array(vec, dim=c(4,2,2))       # create array with first 2 dimensions transposed
lis <- lapply(1:2, function(x) { t(arr[,,x]) }) # transpose the first 2 dimensions
array(do.call(cbind, lis), c(2,4,2))  # convert back to array format

, , 1

     [,1] [,2] [,3] [,4]
[1,]    1   21    2   22
[2,]    3   23    4   24

, , 2

     [,1] [,2] [,3] [,4]
[1,]    5   25    6   26
[2,]    7   27    8   28

答案 2 :(得分:1)

仅使用基础包:

df <- data.frame(x = 1:8, y = 21:28)

array.df <- array(
  data = as.vector(t(df)),
  dim = c(4,2,2))

array.df <- aperm(a = array.df, perm = c(2,1,3))

print(array.df)

答案 3 :(得分:0)

只是想到一个更简单的基础R答案,使用一些数组操作:

apply(array(t(df), dim=c(4,2,2)), c(1,3), t)

#, , 1
#
#     [,1] [,2] [,3] [,4]
#[1,]    1   21    2   22
#[2,]    3   23    4   24
#
#, , 2
#
#     [,1] [,2] [,3] [,4]
#[1,]    5   25    6   26
#[2,]    7   27    8   28

使用一些matrix技巧按行填充,然后重新整形。 sapply的{​​{1}}确保simplify="array"输出:

array