2013-02-18 83 views
2

我有一個矩陣,它具有以下前兩列:位置,年份。隨後是50列,每個日曆日一個。如果位置未被訪問,則天的列具有「NA」,如果位置是,則爲1。R:基於柱面值創建3D矩陣

例如:

Location Year 1 2 3 4 5 6 7 8 9 10 .... 50 
Site1 2005 NA NA NA 1 NA NA 1 NA NA 1 .... NA 
Site2 2006 NA NA 1 NA NA NA 1 NA NA 1 .... NA 

我已經使用了重塑包之前創建4點維矩陣,在用作可變熔化,然後將數據幀中的每個列投陣列。但是,在這裏,我有多個專欄,似乎並不如此。

我想創建以下文件:

dim Y: locations 
dim X: days 1-50 
dim Z: Years 

這幾乎就像從每年提取數據,並通過天陣一前一後堆放的每個位置。有沒有人知道以這種方式創建三維數組的最佳方式是什麼?

謝謝。

回答

0

目前尚不清楚你想有(你給一些最終結果的不只是結構值,以及一些數據上工作)什麼做

首先,我複製你的數據

dat <- data.frame(Location =c('Site1','Site2'), 
      Year=c(2005,2006)) 
dat <- cbind(dat,matrix(sample(c(1,NA),100,rep=T),ncol=50)) 

然後使用reshape2我得到這個:

library(reshape2) 
melt(dat,id.vars=c('Location','Year')) 
    Location Year variable value 
1  Site1 2005  1 NA 
2  Site2 2006  1 NA 
3  Site1 2005  2  1 
4  Site2 2006  2 NA 
5  Site1 2005  3 NA 
6  Site2 2006  3  1 
7  Site1 2005  4  1 
8  Site2 2006  4 NA 
+0

看到我上面的回覆,但我最終創建了一個類似的矩陣,然後在重塑中使用該投射函數來創建我正在尋找的三個維度。謝謝! – 2013-02-18 01:09:44

0

有可能是一個更乾淨的方式來處理reshape2庫,但使用lapply會給你乾淨的列表。如果你需要他們作爲一個數組,只是轉換爲

arr <- lapply(unique(dat$Location), function(L) dat[dat$Location==L, -1]) 

# add names, to keep it neat 
names(arr) <- unique(dat$Location) 

# Convert to array if needed 
arr <- as.array(arr) 
+0

謝謝里卡多,但我只是試過這個,它只是給了我一個路由列表。我需要一個實際的三維矩陣,其中行是位置,列是日期,第三維是年份。你知道我可以嘗試重塑2嗎? – 2013-02-18 00:56:13

0

我猜你想要刪除NAs。

library(reshape2) 

test <- read.table(text="Location Year 1 2 3 4 5 6 7 8 9 10 
Site1 2005 NA NA NA 1 NA NA 1 NA NA 1 
Site2 2006 NA NA 1 NA NA NA 1 NA NA 1", h=T) 

melt(test, id = c("Location", "Year"), na.rm = TRUE, variable.name = "day")[, -4] 

# Location Year day 
# 6  Site2 2006 X3 
# 7  Site1 2005 X4 
# 13 Site1 2005 X7 
# 14 Site2 2006 X7 
# 19 Site1 2005 X10 
# 20 Site2 2006 X10 
+0

感謝您的回覆!這是我最終做的事情:trial1 < - melt(data,id = c(「Location」,「Year」),na.rm = TRUE,variable.name =「day」) colnames(trial1)< - c (「Location」,「Year」,「jday」,「Det」) det.matrix = cast(trial1,Location〜jday〜Year,measure.var =「Det」) dim(det.matrix) – 2013-02-18 01:07:36