【问题标题】:R - create new vectors based on elements of existing vectorR - 根据现有向量的元素创建新向量
【发布时间】: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


【解决方案1】:

tidyr 包可以将这张长桌展开成更宽的桌:

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

【讨论】:

  • 感谢您的帮助。这可行,但我认为我更喜欢 dcast 的输出,正如上面 akrun 所推荐的那样。有这么多选择真是太好了。
猜你喜欢
  • 2021-07-28
  • 2022-06-28
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多