2015-02-06 2 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 (ДФ, studentID ~ classNumber, value.var = 'classRating')' 'из библиотеки (reshape2) ' – akrun

+0

Вы также должны прочитать файл справки для' ifelse' (векторизован) и понять, как он отличается от 'if (cond) expr1 else expr2' (без векторизации). – nrussell

+1

'reshape' заставляет вас закрыть:' reshape (dat, v.names = "classRating", idvar = "studentID", timevar = "classNumber", direction = "wide") ' – user20650

ответ

0

tidyr пакета может распространить этот длинный стол в более широкую один:

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

Благодарим вас за помощь. Это работает, но я думаю, что я предпочитаю выход из dcast, как рекомендовано akrun выше. Это здорово, что есть так много вариантов. – bycin

Смежные вопросы