我有一个矩阵(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
有人能告诉我代码有什么问题吗?我真的不明白“重塑”的帮助文件,这有点令人困惑......谢谢!
答案 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。