2015-02-06 65 views
1

創建新載體,並提前感謝您的幫助。我對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

嘗試'dcast(DF,studentID〜classNumber,value.var = 'classRating')''從庫(reshape2) ' – akrun 2015-02-06 16:10:57

+0

您還應該閱讀'ifelse'的幫助文件(矢量化),並瞭解它與if(cond)expr1 else expr2'(非矢量化)的區別。 – nrussell 2015-02-06 16:12:30

+1

'reshape'讓你關閉:''reshape(dat,v.names =「classRating」,idvar =「studentID」,timevar =「classNumber」,direction =「wide」)' – user20650 2015-02-06 16:12:58

回答

0

tidyr包可以傳播這個長表變成較寬之一:

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

謝謝你的幫助。這是有效的,但我認爲我更喜歡dcast的輸出,正如上面akrun所建議的那樣。它很棒,有很多選擇。 – bycin 2015-02-06 17:19:14