2012-02-25 100 views
4

我想使用reshape2软件包将一些数据从long转换为wide,但是我收到了一个我无法解决的错误。在下面的例子中,我创建了一些与我的真实数据类似的假数据。我想将每个“主题”转换为包含该主题中所有“学分”总和的列,以获得给定的“ID”编号。如何使用R中的reshape2包解决dcast错误?

library(reshape2) 

#创建假数据并把它变成一个数据帧

ID = rep(c(100,101,102,103), each=5) 
subj = rep(c("CHEM","ENGL","HIST","MATH"), 5) 
credits = rep(3, 20) 
df = data.frame(ID, subj, credits) 

#从长转换为宽,以“SUBJ”的值作为新的列
#和的总和“信用”的值,每个“SUBJ”

df.wide = dcast(df, ID ~ subj, value.var=credits, fun.aggregate=sum) 

这里就是我试图让当我运行dcast命令:

ID CHEM ENGL HIST MATH 
100  6  3  3  3 
101  3  6  3  3 
[and so on for each value of ID] 

这里的错误我真正得到,当我运行上面的代码:

Error in .subset2(x, i, exact = exact) : 
recursive indexing failed at level 2 

我得到同样的错误,如果我从dcast呼叫中除掉“fun.aggregate = SUM”。

另外,如果我创建了值“信用”使用样本()函数(而不是代表()),并调用dcast(不fun.aggregate = SUM),我收到以下错误:

Error in .subset2(x, i, exact = exact) : 
no such index at level 1 

我已经运行了什么,据我所知,类似的dcast命令之前没有问题。我猜我会打我的额头,当我看到解决方案时大声喊出“doh”,但我被卡住了。

回答

6

只要把学分引号:

df.wide = dcast(df, ID ~ subj, value.var="credits", fun.aggregate=sum) 
df.wide 
    ID CHEM ENGL HIST MATH 
1 100 6 3 3 3 
2 101 3 6 3 3 
3 102 3 3 6 3 
4 103 3 3 3 6 
+0

你能看看http://stackoverflow.com/questions/18882475/r-how-to-get-something-like-adjacency-matrix - 但是在十字路口值的/ 18883106#18883106并建议我一些修改? – andi 2013-09-18 22:04:00

相关问题