【问题标题】:Error in if (lastnote[i] < 50) { : missing value where TRUE/FALSE neededif (lastnote[i] < 50) { 中的错误:需要 TRUE/FALSE 的缺失值
【发布时间】:2019-06-26 15:05:13
【问题描述】:

我正在努力学习 R。所以我是初学者。我想编写如下代码,但我有问题。如果你能帮助我,我会感激不尽。

这只是我的练习。我一直在阅读一些关于 R 的书籍,并且一直在尝试做一些事情

class1 <- data.frame(name=c("a1","a2","a3","a4","a5","a6","a7","a8","a9","a10"), 
            surname= c("b1","b2", "b3", "b4", "b5","b6","b7","b8","b9","b10"),
            exam1= c(25,35,55,65,75,35,80,90,100,65),
            exam2 = c(56,65,25,95,78,69,45,23,45,63),
            final= c(65,55,78,93,65,89,89,95,100,75))
lastnote <- (((class1$exam1+class1$exam2)/2)*0.4 + (class1$final*0.6))
lastnote
class1[,"lastnote"] <- lastnote

for (i in lastnote)
if(lastnote[i] < 50) {x= "FF"
} else if(lastnote[i] < 60) {x= "CD"
} else if(lastnote[i] < 65) {x= "CC"
} else if(lastnote[i] < 70) {x= "BC" 
} else if(lastnote[i] < 80) {x= "BB"
} else if(lastnote[i] < 90) {x= "AB"
} else {x= "AA"}

x 将是本例中学生的字母数字。 我希望在 class1 中创建一个名为 x 或新列的向量 非常感谢您的帮助。

【问题讨论】:

  • 您是要访问列表中的lastnote 变量还是要添加一个拥有这些值的列?
  • 你遍历 lastnote 的元素。那么你就不能使用lastnote[i],而只能使用i。否则,使用 for(i in 1:length(lastnote)) 迭代从 1 到 lastnote 长度的数字,以使您的代码正常工作。
  • 嗨 Jenks,我正在尝试在值中添加一列
  • 嗨,朱利安,是的,它奏效了。谢谢你 。但是当我看 x 时,只写了“FF”
  • @pomatomus 你在每次迭代时影响单个值在同一位置,你需要在向量的正确位置影响结果

标签: r for-loop


【解决方案1】:

您可以在base R 中使用cut

class1$letters <- cut(class1$lastnote, breaks = c(0, 50, 60, 65, 70, 80, 90, 100), labels = c("FF", "CD", "CC", "BC", "BB", "AB", "AA"))
class1

输出:

   name surname exam1 exam2 final lastnote letters
1    a1      b1    25    56    65     55.2      CD
2    a2      b2    35    65    55     53.0      CD
3    a3      b3    55    25    78     62.8      CC
4    a4      b4    65    95    93     87.8      AB
5    a5      b5    75    78    65     69.6      BC
6    a6      b6    35    69    89     74.2      BB
7    a7      b7    80    45    89     78.4      BB
8    a8      b8    90    23    95     79.6      BB
9    a9      b9   100    45   100     89.0      AB
10  a10     b10    65    63    75     70.6      BB

【讨论】:

  • 很高兴它有帮助!
【解决方案2】:

我会使用dplyr 包和case_when 函数来完成此操作。

class1 %>% 
    mutate(lastnote =((exam1+exam2)/2)*0.4 + (final*0.6),
           Final_Value = case_when(lastnote < 100 ~ 'AA',
                                   lastnote < 90 ~ 'AB',
                                   lastnote < 80 ~ 'BB',
                                   lastnote < 70 ~ 'BC',
                                   lastnote < 65 ~ 'CC',
                                   lastnote < 60 ~ 'CD',
                                   lastnote < 50 ~ 'FF'))

【讨论】:

    【解决方案3】:

    您可以使用相同的循环条件,只需少量更改

    xx<-c()
    for (i in unique(lastnote)){
      if(i < 50) {x= "FF"
      } else if(i < 60) {x= "CD"
      } else if(i < 65) {x= "CC"
      } else if(i < 70) {x= "BC" 
      } else if(i < 80) {x= "BB"
      } else if(i < 90) {x= "AB"
      } else {x= "AA"}
      xx<- append(xx,x)
    }
    
    print (xx)
    [1] "CD" "CD" "CC" "AB" "BC" "BB" "BB" "BB" "AB" "BB"
    

    【讨论】:

    • @pomatomus 非常感谢,如果您找到问题的答案,您可以投票
    • 谢谢。是的,我做到了。我如何投票?我不知道。如您所见,我是这个网站的新手。
    • @pomatomus 只需单击 0 上方的向上箭头,因此我们获得选票和 10 分。如果你也在下面打勾,我们得到 25 分
    • @pomatomus 你可以投票赞成/反对你想要的答案,并接受你认为最好的答案
    猜你喜欢
    • 2021-01-06
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多