Более короткий метод для замены записей в R [дубликат]

На этот вопрос уже есть ответ здесь:

Измените значения в нескольких столбцах кадра данных, используя таблицу поиска 2 ответа

Я начал изучать R недавно. Вот исходный файл, с которым я работаю (https://github.com/cosname/art-r-translation/blob/master/data/Grades.txt). Можно ли в любом случае изменить буквенную оценку, скажем, от A до 4.0, от A до 3.7 и т. Д., Не используя цикл?

Я спрашиваю, потому что, если бы было 1М записей, цикл «for» может быть не самый эффективный способ изменить данные. Буду признателен за любую помощь.

Поскольку один из авторов велел мне опубликовать свой код, я подумал о запуске цикла for, чтобы посмотреть, смогу ли я это сделать. Вот мой код:

mygrades<-read.table("grades.txt",header = TRUE)

i <- for (i in 1:nrow(mygrades))
{
  #print(i)  
  #for now, see whether As get replaced with 4.0.
  if(mygrades[i,1]=="A")
  {
    mygrades[i,1]=4.0
  }
  else if (mygrades[i,2]=="A")
  {
    mygrades[i,2]=4.0
  }
  else if (mygrades[i,3]=="A")
  {
    mygrades[i,3]=4.0
  }
  else
  {
    #do nothing...continues
  }

}

write.table(mygrades,"newgrades.txt")

Тем не менее, вывод немного странный. Для некоторых «А» я получаю НС, а другие остаются как есть. Может кто-нибудь помочь мне с этим кодом?

@alistaire, я попробовал справочную таблицу Хэдли, и она работает. Я также посмотрел на код dplyr, и он работает хорошо. Однако, ради моего понимания, я все еще пытаюсь использовать для циклов. Обратите внимание, что прошло около двух дней с тех пор, как я открыл книгу R. Вот модифицированный код.

#there was one mistake in my code: I didn't use stringsAsFactors=False.
#now, this code doesn't work for all "A"s. It spits out 4.0 for some As, and #doesn't do so for others. Why would that be?

mygrades<-read.table("grades.txt",header = TRUE,stringsAsFactors=FALSE)

i <- for (i in 1:nrow(mygrades))
{
  #print(i)  
  if(mygrades[i,1]=="A")
  {
    mygrades[i,1]=4.0
  }
  else if (mygrades[i,2]=="A")
  {
    mygrades[i,2]=4.0
  }
  else if (mygrades[i,3]=="A")
  {
    mygrades[i,3]=4.0
  }
  else
  {
    #do nothing...continues
  }

}

write.table(mygrades,"newgrades.txt")

Выход:

"final_exam" "quiz_avg" "homework_avg"
"1" "C" "4" "A"
"2" "C-" "B-" "4"
"3" "D+" "B+" "4"
"4" "B+" "B+" "4"
"5" "F" "B+" "4"
"6" "B" "A-" "4"
"7" "D+" "B+" "A-"
"8" "D" "A-" "4"
"9" "F" "B+" "4"
"10" "4" "C-" "B+"
"11" "A+" "4" "A"
"12" "A-" "4" "A"
"13" "B" "4" "A"
"14" "D-" "A-" "4"
"15" "A+" "4" "A"
"16" "B" "A-" "4"
"17" "F" "D" "A-"
"18" "B" "4" "A"
"19" "B" "B+" "4"
"20" "A+" "A-" "4"
"21" "4" "A" "A"
"22" "B" "B+" "4"
"23" "D" "B+" "4"
"24" "A-" "A-" "4"
"25" "F" "4" "A"
"26" "B+" "B+" "4"
"27" "A-" "B+" "4"
"28" "A+" "4" "A"
"29" "4" "A-" "A"
"30" "A+" "A-" "4"
"31" "4" "B+" "A-"
"32" "B+" "B+" "4"
"33" "C" "4" "A"

Как вы можете видеть в первом ряду, первый A был перекодирован как 4, но второй A не был перекодирован. Есть идеи, почему это происходит?

Заранее спасибо.

Ответы на вопрос(1)

Ваш ответ на вопрос