为向量中的段创建循环,为每个相应的段提供返回值

问题描述 投票:-1回答:1

我创建了一个100个随机数的矢量“numGrades”来表示评分系统中的值。我需要编写一个“for”循环,它接受数字等级的段并返回相应字母等级的向量,即:90+ =“A”,80-89 =“B”,70-79 =“C”,60- 69 =“D”,0-59 =“F”。我希望能够运行numGrades来返回相应的字母等级,例如:numGrades = [72,65,93] return = [“C”,“D”,“A”],带有任意长度的循环处理向量。这是我迄今为止单独尝试过的。所有这些循环都返回了警告:

set.seed(43)
numGrades <- sample(0:100, 100, replace=FALSE)

for (i in numGrades )
  if(91 <= numGrades[i]) {
    numGrades[i] <- "A"
  } else if (80 <= numGrades[i] & numGrades[i] <= 90) {
    numGrades[i] =="B"
  } else if (70 <= numGrades[i] & numGrades[i] <= 79) {
    numGrades[i] =="C"
  } else if (60 <= numGrades[i] & numGrades[i] <= 69) {
    numGrades[i] =="D"
  } else if (0 <= numGrades[i] & numGrades[i] <= 59) {
    numGrades[i] =="F"
  }

它说:

Error in if (91 <= numGrades[i]) { : 
  missing value where TRUE/FALSE needed

新编辑(成绩返回> = 91):

numGrades <- (0:100)
for (i in 1:length(numGrades ))
  if(91 <= numGrades[i]) {
    numGrades[i] <- "A"
  } else if (80 <= numGrades[i] & numGrades[i] <= 90) {
    numGrades[i] =="B"
  } else if (70 <= numGrades[i] & numGrades[i] <= 79) {
    numGrades[i] =="C"
  } else if (60 <= numGrades[i] & numGrades[i] <= 69) {
    numGrades[i] =="D"
  } else if (0 <= numGrades[i] & numGrades[i] <= 59) {
    numGrades[i] =="F"
  }

工作草稿

ltrGrades <- (0:100)
numGrades <- character(length(ltrGrades))

for (i in 1:length(ltrGrades ))
  if(any(ltrGrades[i] == 91:100)) {
    numGrades[i] <- "A"
  } else if (any(ltrGrades[i] == 80:90)) {
    numGrades[i] <- "B"
  } else if (any(ltrGrades[i] == 70:79)) {
    numGrades[i] <- "C"
  } else if (any(ltrGrades[i] == 60:69)) {
    numGrades[i] <- "D"
  } else if (any(ltrGrades[i] == 0:59)) {
    numGrades[i] <- "F"
  }
r loops vector return rscript
1个回答
0
投票

您的代码存在一些基本的R语法问题。

(numGrades[i]) c(80:90))
(numGrades[i]) >=80 && <=89)
(numGrades[i]) ==80:89 )

几种替代方案,效率最低:

(80 <= numGrades[i] & numGrades[i] < 90)    # the most basic
(dplyr::between(numGrades[i], 80, 90))      # if dplyr is loaded
(data.table::between(numGrades[i], 80, 90)) # if data.table is available
(numGrades[i] %in% 80:89)                   # works only if all grades are perfectly integral
(any(numGrades[i] == 80:89))                # ditto

他们为什么错了?

  • (numGrades[i]) c(80:90)),因为没有运营商
  • (numGrades[i]) >=80 && <=89),R并没有按照你的建议推断它们,每次你进行(in)平等测试时,你需要为每一个指定LHS和RHS;同样地,不太可能是许多语言,R不会“链接”它们,所以(80 <= numGrades[i] <= 89)将不起作用
  • (numGrades[i]) ==80:89 )越来越近,但if / else声明需要一个比较;在这种情况下,您将一个数字与序列(范围)10进行比较,因此这样的答案是长度10.它必须是长度1。

但最重要的是,你不需要循环。

# set.seed(43)
numGrades <- sample(0:100, 100, replace=FALSE)
cut(numGrades, c(-1, 60, 70, 80, 90, 101), labels=c("F","D","C","B","A"))
#   [1] F A F D F F D F F C F F F F F B F A F F C A F F F F A F A F C C C B F
#  [36] F F F B A F F F A B B C D F F F B D F F B D D B F F F F F F D F A F F
#  [71] F F F F B F D F A F F F F F A B F F F C F F F D D C C F F F
# Levels: F D C B A

或者,如果你不喜欢或不了解factor是什么,那么

as.character(cut(numGrades, c(-1, 60, 70, 80, 90, 101), labels=c("F","D","C","B","A")))
#   [1] "F" "A" "F" "D" "F" "F" "D" "F" "F" "C" "F" "F" "F" "F" "F" "B" "F"
#  [18] "A" "F" "F" "C" "A" "F" "F" "F" "F" "A" "F" "A" "F" "C" "C" "C" "B"
#  [35] "F" "F" "F" "F" "B" "A" "F" "F" "F" "A" "B" "B" "C" "D" "F" "F" "F"
#  [52] "B" "D" "F" "F" "B" "D" "D" "B" "F" "F" "F" "F" "F" "F" "D" "F" "A"
#  [69] "F" "F" "F" "F" "F" "F" "B" "F" "D" "F" "A" "F" "F" "F" "F" "F" "A"
#  [86] "B" "F" "F" "F" "C" "F" "F" "F" "D" "D" "C" "C" "F" "F" "F"

编辑

我刚注意到你的代码还有其他一些东西。

当你开始时,numGrades是数字或整数。但是,由于它是矢量,因此第一次将字母分配给其中一个元素时,整个矢量将转换为character矢量。第二次通过for循环将尝试将数字与字符串进行比较,这不会进行数字比较,请尝试8 < "75"为什么会失败。

作为解决方法:

ltrGrades <- character(length(numGrades))
for (i in 1:length(numGrades ))
  if(91 <= numGrades[i]) {
    ltrGrades[i] <- "A"
  } else if (80 <= numGrades[i] & numGrades[i] <= 90) {
    ltrGrades[i] <- "B"
  } else if (70 <= numGrades[i] & numGrades[i] <= 79) {
    ltrGrades[i] <- "C"
  } else if (60 <= numGrades[i] & numGrades[i] <= 69) {
    ltrGrades[i] <- "D"
  } else if (0 <= numGrades[i] & numGrades[i] <= 59) {
    ltrGrades[i] <- "F"
  }
© www.soinside.com 2019 - 2024. All rights reserved.