2014-11-07 83 views
1

我有以下数据。 (个体= 2,时间= 3,所以1,2,3分别是单独1,4,5,6是用于个别2)二维数据到R中的三维数据

 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,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 

我希望有人能帮助我。谢谢。

回答

2

看到您的预期结果,我认为您正在寻找一份清单。首先,您要创建一个带有主题ID的列。然后,您可以使用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) 
+0

“ana”怎么样? – user3901071 2014-11-07 04:49:31

+0

对不起。这意味着“mydf”。当我测试代码时,我倾向于使用人名。我现在改变了! – jazzurro 2014-11-07 04:50:44

2

如果你真的想要一个数组,因为它是所有的数字数据,你可以做

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 
2

有一个名为外部包“abind”有同名的函数使这非常容易。唯一的尝试部分是弄清楚,你需要告诉它你想要第三个维度。既然是在参数列表中的省略号后的“顺”的说法必须命名为:

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 

请求调用策略不能准确地跟着,因为括号不能用于索引你必须我们的方括号。恐怕行数不能完好无损。

+0

我不知道这个包。感谢您的信息。 +1。 – jazzurro 2014-11-07 03:16:32