我有一个数据帧“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
任何人都可以帮我解决这些问题吗?感谢。
答案 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