2014-11-07 70 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