2012-01-31 90 views
2

我有一個矩陣(d),看起來像:如何重塑一個矩陣

d <- 
as.matrix(read.table(text = " 
    month Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13   
X10 10 7.04 8.07 9.4 8.17 9.39 8.13 9.43 9.06 8.59 9.37 9.79 8.47 8.86 
X11 11 12.10 11.50 12.6 13.70 11.90 11.50 13.10 17.20 19.00 14.60 13.70 13.20 16.10 
X12 12 24.00 22.00 22.2 20.50 21.60 22.50 23.10 23.30 30.50 34.10 36.10 37.40 28.90 
X1  1 18.30 16.30 16.2 14.80 16.60 15.40 15.20 14.80 16.70 14.90 15.00 13.80 15.90 
X2  2 16.70 14.40 15.3 14.10 15.50 16.70 15.20 16.10 18.00 26.30 28.00 31.10 34.20", 
header=TRUE)) 

從Q1將Q31(其天每月)。我想得到的是:

month day Q 
10 1 7.04 
10 2 8.07 

等31天和12個月。

我曾嘗試使用下面的代碼嘗試:

reshape(d, direction="long", varying = list(colnames(d)[2:32]), v.names="Q", idvar="month", timevar="day") 

,但我得到的錯誤:

Error in d[, timevar] <- times[1L] : subscript out of bounds

誰能告訴我什麼是錯誤的代碼?我真的不明白關於「重塑」的幫助文件,這有點令人困惑......謝謝!

回答

3

幾乎在那裏 - 你只是錯過as.data.frame(d)使你的矩陣變成一個數據框架。你也不必在varying列表 - 只是一個載體,所以

reshape(as.data.frame(d), varying=colnames(d)[2:32], v.names="Q", 
     direction="long", idvar="month", timevar="day") 
+0

對於'reshape()',爲了正確處理'vary'中的列名,這仍然需要一個'sep =「」'... – 2012-01-31 18:48:03

+0

謝謝!它完美地工作(沒有sep =「」) – sbg 2012-01-31 19:58:21

+0

@ JoshO'Brien,因爲'v.names'被指定,'reshape'沒有試圖確定原始列名的名字,所以不需要'sep'。 – 2012-01-31 21:45:24

2

重塑上的幫助文件不是有點混淆。這很令人困惑。假設你的矩陣有12行(每月1)和31列(我猜你有NA值小於31的月份),你可以輕鬆地構造這個。

d <- data.frame(month = rep(d[,1], 31), day = rep(1:31, each = 12), Q = as.vector(d[,2:32]) 

現在,回到您的整形...我猜這不是正確解析您的列的名稱。它可能會更好地與Q.1,Q.2等。順便說一句,我上面的重塑取決於你實際呈現的是矩陣而不是數據框。

+0

感謝這也工作得很好!我應該想到在幾次挫敗嘗試之後避開重塑函數:) – sbg 2012-01-31 20:01:06

3

幫助文件混亂赫克,這不僅是因爲(我已經學會)所需的信息幾乎總是實際上是在那裏---某處。

作爲一個典型的例子,中途的幫助文件中,有此位:

功能將 試圖猜測從這些名字的「v.names」和「時代」 [即'變化'參數]。 默認爲變量名稱,如'x.1','x.2',其中'sep =「。''' 指定在點處拆分並將其從名稱中刪除。要有 字母后跟數字時間,請使用'sep =「」'。

最後一句話是,你需要在這裏的人:"Q1""Q2"等確實是「字母后面的數字」,所以你需要設置sep = ""的說法,如果reshape()是知道如何分道揚鑣的列名。

試試這個:

res <- reshape(as.data.frame(d), idvar="month", timevar="day", 
       varying = -1, direction = "long", sep = "") 

head(res[with(res, order(month,day)),]) 
#  month day Q 
# 1.1  1 1 18.3 
# 1.2  1 2 16.3 
# 1.3  1 3 16.2 
# 1.4  1 4 14.8 
# 1.5  1 5 16.6 
# 1.6  1 6 15.4 
+0

謝謝,但這似乎並不是問題,因爲它仍然產生一個錯誤 – sbg 2012-01-31 19:58:57

+0

這很奇怪。出於好奇,你能否花些時間在你的問題的代碼框中加載數據,然後在其上運行我的代碼?如果代碼框中的數據與您的數據真正匹配,並且它不起作用,那麼我真的很難理解發生了什麼! – 2012-01-31 20:07:03