¿Cómo cambiar los nombres de columna en el marco de datos en R? [cerrado]

9
 names(mydat)[c(name)]<-c("newname") 

A partir de esto, sé que el nombre de columna / variable "nombre" del marco de datos mydat se reemplaza con "nombre nuevo".

Mi pregunta es si, quiero hacer esto por un bucle para tener algo como:

newname1 newname2 newname3 newname4 y así sucesivamente, ¿cómo lo hago?

Esto es lo que funcionó y no funcionó:

for(i in 1:4){
names(mydat)[c(name)]<-c("newname"i)
}

¿Hay alguna manera de codificar esto? Muchas gracias a todos los que pudieron ser de ayuda. Owusu Isaac

Hijo
fuente
44
Esta pregunta parece estar fuera de tema porque se trata únicamente de programación.
gung - Restablece a Monica
Si necesita cambiar el nombre de algunos nombres de variables feos (por ejemplo, abcde_1_1, abcde_2_2, abcde_3_3 ...) como sucede con frecuencia en algunos conjuntos de datos descargados de Qualtrics: ugly_vars <- names(dplyr::select(df, starts_with("abcde_"))) names(ESM_df[ugly_vars]) <- str_c("abc_", 1:length(ugly_vars))
JetLag

Respuestas:

10

La solución más obvia sería cambiar su código for loop con lo siguiente:

   names(mydat)[c(name)] <- paste("newname",i,sep="")

Pero necesita aclarar cuál es su variable name. Por el momento, este bucle hará 4 cambios de nombre de la columna individual.

En general, si los nombres que desea cambiar están en vector, este es un procedimiento de subconjunto estándar:

 names(mydat)[names(mydat)%in% names_to_be_changed] <- name_changes
mpiktas
fuente
Hola Mpiktas, tu solución funciona de manera excelente. muchas gracias. y gracias a todos también
Hijo
1
@Owusu, la expresión de gratitud en este sitio es la votación positiva de las respuestas y su aceptación. Ver las preguntas frecuentes . De cualquier manera, me alegra ser útil.
mpiktas
6

Intente usar sprintfo paste, de esta manera:

names(mydat)<-sprintf("name%d",1:10)

Además, tenga en cuenta que el names(mydat)[c(name)]es un sin sentido más; c(name)es equivalente a escribir solo namey significa "obtener el valor de la variable llamada name'; el corchete extraerá al menos elementos de names(mydat)pero solo si la namevariable contiene un índice numérico o booleano.

Si desea reemplazar columnas llamadas namecon name1, name2, ..., nameN, use algo como esto:

names(mydat)[names(mydat)=="name"]<-sprintf("name%d",1:sum(names(mydat)=="name"))

EDITAR: Bueno, si solo desea eliminar nombres de columna duplicados, hay una manera aún más fácil; R tiene una make.namesfunción que soluciona este problema; se puede usar así:

names(mydat)<-make.names(names(mydat),unique=TRUE)

Aún más corto, lo mismo solo se puede obtener escribiendo:

data.frame(mydat)->mydat #The magic is in check.names, but it is TRUE by default

fuente
@mbq, == ¿coincide parcialmente las cadenas?
mpiktas
@mpiktas No, pero solo se necesita coincidencia exacta aquí. greplestaría bien hacer el trabajo más general.
@mbq, sí, pero eso supone que hay varias columnas con el mismo nombre. R lo permite, pero trato de evitar usar esta función.
mpiktas
@mpiktas Al parecer, también lo hace el OP, por lo tanto, esta pregunta.
@mbq gracias por aclarar la confusión con los nombres (mydat) [c (nombre)] Ya que el OP ha escrito , sé que la columna / nombre de la variable "nombre" estaba como "wow, ¿eso es posible?" e intenté acceder a los nombres por nombre ... estúpido;). ¿Puedo sugerir humildemente editar la pregunta?
steffen
5

Tuve el mismo problema y lo resolví con este código:

names(mydat) <- paste("newname", 1:ncol(mydat), sep="");
Cuong
fuente