R - 基于现有向量的元素创建新向量

时间:2015-02-06 16:09:02

标签: r

并提前感谢您的帮助。我是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,只使用第一个元素

我的技能水平超出了我的想法。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

tidyr 包可以将这个长表扩展为更宽的表:

library(tidyr)
spread(classDB,classNumber,classRating,fill=NA)