如何重塑矩阵

时间:2012-01-31 17:35:56

标签: r reshape

我有一个矩阵(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 个答案:

答案 0 :(得分: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")

答案 1 :(得分:3)

帮助文件 令人困惑,尤其是因为(正如我所知道的那样)必要的信息几乎总是在那里 - 某处。

作为一个主要的例子,在帮助文件的中间,有这一点:

  

该功能将        试图从这些名称猜测'v.names'和'times'[即“变化”论证中的那些。该        default是变量名,如'x.1','x.2',其中'sep =“。”'        指定在点处拆分并从名称中删除它。具有        字母后跟数字时间使用'sep =“”'。

最后一句是你在这里需要的句子:"Q1""Q2"等确实是“按字母顺序后跟数字”,所以你需要设置sep = ""参数if {{ 1}}是知道如何拆分这些列名称。

试试这个:

reshape()

答案 2 :(得分: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等方面效果更好。顺便说一句,我上面的重塑实际上取决于你所呈现的实际上是矩阵而不是data.frame。