Método mais curto para substituir entradas em R [duplicado]

Esta pergunta já tem uma resposta aqui:

Alterar valores em várias colunas de um quadro de dados usando uma tabela de pesquisa 2 respostas

Comecei a aprender R recentemente. Aqui está o arquivo de origem com o qual estou trabalhando (https://github.com/cosname/art-r-translation/blob/master/data/Grades.txt) Existe alguma maneira de alterar a nota da letra de, digamos, A para 4.0, A- para 3.7 etc. sem usar o loop?

Estou perguntando porque, se houver entradas de 1 milhão, o loop "for" pode não ser a maneira mais eficiente de modificar os dados. Eu apreciaria qualquer ajuda.

Como um dos pôsteres me disse para postar meu código, pensei em executar o loop for para ver se sou capaz de fazê-lo. Aqui está o meu código:

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")

No entanto, a saída é um pouco estranha. Para alguns "A", recebo NA e outros ficam como estão. Alguém por favor pode me ajudar com este código?

@alistaire, tentei a mesa de consulta de Hadley e funciona. Eu também olhei para o código dplyr, e ele funciona bem. No entanto, para o meu entendimento, ainda estou tentando usar loops. Observe que já se passaram cerca de dois dias desde que abri um livro de R. Aqui está o código modificado.

#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")

A saída é:

"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"

Como você pode ver na primeira linha, o primeiro A foi recodificado como 4, mas o segundo A não foi recodificado. Alguma idéia de por que isso está acontecendo?

Desde já, obrigado.

questionAnswers(1)

yourAnswerToTheQuestion