Как распечатать выходные данные из цикла в одну строку? - PullRequest
0 голосов
/ 20 февраля 2019

Я должен сделать калькулятор оценок в r, который может конвертировать числовые оценки в буквенные оценки.Вот код, который я придумал:

numGrades<-(c(66,02,99,59,82))
for(i in 1:length(numGrades)) {
if (numGrades[i]>=90){
print("A")
} else if (numGrades[i]>=80){
print("B")
}  else if (numGrades[i]>=70){
print("C")
}  else if (numGrades[i]>=60){
print("D")
} else {
print("F")}
}

Я не могу найти способ интегрировать функции cat или print (c ()) так, чтобы он печатал в одну строку, а не получал:

 [1] "D"`    
 [1] "F"`
 [1] "A"
 [1] "F"
 [1] "B"

Если у кого-то есть какие-либо идеи, это будет с благодарностью!

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

Только для записи, нет необходимости использовать цикл for, вы можете использовать вложенный ifelse

> graded2 <- ifelse(numGrades>=90, "A",
                    ifelse(numGrades >= 80 & numGrades < 90, "B",
                           ifelse(numGrades >= 70 & numGrades < 80, "C",
                                  ifelse(numGrades >= 60 & numGrades < 70, "E", "F"))))
> graded2
[1] "E" "F" "A" "F" "B"
0 голосов
/ 20 февраля 2019

почему cat не работает?

numGrades<-(c(66,02,99,59,82))
for(i in 1:length(numGrades)) {
  if (numGrades[i]>=90){
    cat("A ")
  } else if (numGrades[i]>=80){
    cat("B ")
  }  else if (numGrades[i]>=70){
    cat("C ")
  }  else if (numGrades[i]>=60){
    cat("D ")
  } else {
    cat("F ")}
}
0 голосов
/ 20 февраля 2019

Со многими задачами в R лучше делать это, используя векторизованные функции, а не циклы.Вот два способа сделать то, что вы хотите, один с использованием базы R, а другой dplyr::case_when.Обратите внимание, что cut возвращает коэффициент, но вы всегда можете использовать as.character.

numGrades <- c(66,02,99,59,82)
letGrades <- cut(
  numGrades,
  breaks = c(-Inf, 6:9, Inf) * 10,
  labels = LETTERS[c(6, 4:1)],
  right = FALSE
)
letGrades

library(dplyr)
letGrades <- case_when(
  numGrades >= 90 ~ "A",
  numGrades >= 80 ~ "B",
  numGrades >= 70 ~ "C",
  numGrades >= 60 ~ "D",
  TRUE            ~ "F"
)
letGrades
0 голосов
/ 20 февраля 2019

Я бы просто использовал вставить, чтобы объединить все элементы «градуированного» списка.Надеюсь это поможет.

numGrades = graded = (c(66,02,99,59,82))

for(i in 1:length(numGrades)) {
if (numGrades[i]>=90){
graded[i] = "A"
} else if (numGrades[i]>=80){
graded[i] = "B"
}  else if (numGrades[i]>=70){
graded[i] = "C"
}  else if (numGrades[i]>=60){
graded[i] = "E"
} else {
graded[i] = "F"}
}

print(paste(graded))

Это дает:

> print(paste(graded))
[1] "E" "F" "A" "F" "B"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...