[英]2d data to 3d data in R
我有以下数据。 (个人= 2,时间= 3,因此1,2,3适用于个人1,4,5,6适用于个人2)
Y1 Y2 X1 X2 X3 Z1 Z2 Z3
1 20.56 0.40 1 6.38 3 5.412649 9.439068 4.471056
2 21.17 0.33 1 6.70 3 5.193636 8.898775 4.442006
3 21.48 0.39 1 6.74 3 7.077044 9.748003 3.286804
4 22.12 0.62 1 6.83 4 7.685389 10.099790 2.569721
5 22.12 0.64 1 6.83 5 7.981264 10.342030 2.670692
6 21.36 0.34 1 6.78 4 8.287524 10.536250 1.420523
我想将上述2维数组转换为3维数组,(3,8,2)数组。 所以,
data(,,1)=
Y1 Y2 X1 X2 X3 Z1 Z2 Z3
1 20.56 0.40 1 6.38 3 5.412649 9.439068 4.471056
2 21.17 0.33 1 6.70 3 5.193636 8.898775 4.442006
3 21.48 0.39 1 6.74 3 7.077044 9.748003 3.286804
data(,,2)=
Y1 Y2 X1 X2 X3 Z1 Z2 Z3
4 22.12 0.62 1 6.83 4 7.685389 10.099790 2.569721
5 22.12 0.64 1 6.83 5 7.981264 10.342030 2.670692
6 21.36 0.34 1 6.78 4 8.287524 10.536250 1.420523
我希望有人可以帮助我。 谢谢。
看到您的预期结果,我认为您正在寻找清单。 首先,您要创建一个带有主题ID的列。 然后,您可以使用split
使用变量split
数据帧。 如果需要单独的数据框架,则可以使用list2env
并在全局环境中创建新的数据框架。
# Create a column with subject ID
mydf$ID <- rep(c(1,2), each = 3)
# Split your data frame by ID
split(mydf, f = mydf$ID)
#$`1`
# Y1 Y2 X1 X2 X3 Z1 Z2 Z3 ID
#1 20.56 0.40 1 6.38 3 5.412649 9.439068 4.471056 1
#2 21.17 0.33 1 6.70 3 5.193636 8.898775 4.442006 1
#3 21.48 0.39 1 6.74 3 7.077044 9.748003 3.286804 1
#$`2`
# Y1 Y2 X1 X2 X3 Z1 Z2 Z3 ID
#4 22.12 0.62 1 6.83 4 7.685389 10.09979 2.569721 2
#5 22.12 0.64 1 6.83 5 7.981264 10.34203 2.670692 2
#6 21.36 0.34 1 6.78 4 8.287524 10.53625 1.420523 2
# If you need to create separate data frames, use list2env.
list2env(split(mydf, f = mydf$ID), .GlobalEnv)
如果您确实想要数组,因为它都是数字数据,则可以
s <- split(df, rep(1:2, nrow(df)/2))
array(unlist(s), c(3, 8, 2))
# , , 1
#
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] 20.56 0.40 1 6.38 3 5.412649 9.439068 4.471056
# [2,] 21.48 0.39 1 6.74 3 7.077044 9.748003 3.286804
# [3,] 22.12 0.64 1 6.83 5 7.981264 10.342030 2.670692
#
# , , 2
#
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] 21.17 0.33 1 6.70 3 5.193636 8.898775 4.442006
# [2,] 22.12 0.62 1 6.83 4 7.685389 10.099790 2.569721
# [3,] 21.36 0.34 1 6.78 4 8.287524 10.536250 1.420523
有一个名为“ abind”的外部软件包,该软件包具有相同的功能,因此非常容易。 唯一的尝试部分是弄清楚您需要告诉它您想要第三维。 由于它位于参数列表中的省略号之后,因此必须将“ along”参数命名为:
require(abind)
arr <- abind( split( dat, rep(1:2, 3) ), along=3)
arr[, , 1]
#----------
Y1 Y2 X1 X2 X3 Z1 Z2 Z3
2 20.56 0.40 1 6.38 3 5.412649 9.439068 4.471056
4 21.48 0.39 1 6.74 3 7.077044 9.748003 3.286804
6 22.12 0.64 1 6.83 5 7.981264 10.342030 2.670692
arr[,,2]
Y1 Y2 X1 X2 X3 Z1 Z2 Z3
2 21.17 0.33 1 6.70 3 5.193636 8.898775 4.442006
4 22.12 0.62 1 6.83 4 7.685389 10.099790 2.569721
6 21.36 0.34 1 6.78 4 8.287524 10.536250 1.420523
由于括号不能用于索引,因此您必须使用方括号,因此无法完全遵循请求的调用策略。 而且,我担心行号不能完整保留。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.