2012-01-31 94 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