Método más corto para reemplazar entradas en R [duplicar]

Esta pregunta ya tiene una respuesta aquí:

Cambiar valores en varias columnas de un marco de datos usando una tabla de búsqueda 2 respuestas

He comenzado a aprender R recientemente. Aquí está el archivo fuente con el que estoy trabajando (https://github.com/cosname/art-r-translation/blob/master/data/Grades.txt) ¿Hay alguna forma de cambiar la calificación de la letra de, digamos, A a 4.0, A- a 3.7, etc. sin usar el bucle?

Pregunto porque si hubiera entradas de 1M, el bucle "for" podría no ser la forma más eficiente de modificar los datos. Apreciaría cualquier ayuda.

Como uno de los carteles me dijo que publicara mi código, pensé en ejecutar el bucle for para ver si soy capaz de hacerlo. Aquí está mi 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")

Sin embargo, la salida es un poco rara. Para algunas "A", obtengo NA y otras quedan como están. ¿Puede alguien ayudarme con este código?

@alistaire, probé la tabla de consulta de Hadley, y funciona. También miré el código dplyr, y funciona bien. Sin embargo, en aras de mi comprensión, todavía estoy tratando de usar para bucles. Tenga en cuenta que han pasado unos dos días desde que abrí un libro R. Aquí está el 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")

El resultado es:

"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 puede ver en la primera fila, la primera A se recodificó como 4, pero la segunda A no se recodificó. ¿Alguna idea de por qué está sucediendo esto?

Gracias por adelantado.

Respuestas a la pregunta(1)

Su respuesta a la pregunta