【发布时间】:2015-02-06 16:09:01
【问题描述】:
提前感谢您的帮助。我对 R 非常陌生,并且在代码方面遇到了一些问题,在我看来它应该可以工作,但实际上并没有。我有一个如下所示的数据框:
studentID classNumber classRating
7 1 4
7 2 4
7 4 3
79 1 5
79 2 3
116 1 5
116 2 4
134 1 5
134 3 5
134 4 5
我希望它是这样的:
Student ID class1 class2 class3 class4
7 4 4 NA 3
79 5 3 NA NA
116 5 4 NA NA
134 5 NA 5 5
我尝试将遇到的不同事物拼凑在一起,似乎最好的方法是创建一个新的数据框和矩阵,然后从当前数据框填充它。我想出了下面的损坏代码:
classRatings = data.frame(matrix(NA,4,5))
for(i in 1:nrow(classDB)){
#Find ratings by each student
rowsToReplace = classDB$studentID==classRatings$studentID[i]
#Make a row for each unique studentID in classRatings
classDB$studentID[rowsToReplace] = classRatings$studentID[i]
#for each studentID, find put the given rating for each unique class into
#it's own vector
for(j in classDB$classNumber){
if(classDB$classNumber==1){classRatings$class1==classDB$classRating}[j]
if(classDB$classNumber==2){classRatings$class2==classDB$classRating}[j]
if(classDB$classNumber==3){classRatings$class3==classDB$classRating}[j]
if(classDB$classNumber==4){classRatings$class4==classDB$classRating}[j]
if(classDB$classNumber==5){classRatings$class5==classDB$classRating}[j]
}
}
我收到一条错误消息:
条件的长度 > 1 并且只使用第一个元素
我超出了我的技能水平,无法弄清楚。任何帮助表示赞赏。
【问题讨论】:
-
从
library(reshape2)尝试dcast(df, studentID~classNumber, value.var='classRating') -
您还应该阅读
ifelse(矢量化)的帮助文件,并了解它与if (cond) expr1 else expr2(非矢量化)有何不同。 -
reshape让你接近:reshape(dat, v.names="classRating", idvar="studentID",timevar="classNumber" , direction="wide") -
if期望一个真或假来决定是否执行下一个语句。在if(classDB$classNumber==1)中,您将 classNumber 的每个元素与 1 进行比较,因此您将得到一个逻辑向量,即输入向量的长度。if基本上是指出这个错误,并在代码中取第一个元素往前走 -
谢谢你,akrun,效果很好!
标签: r