tablas - ¿Existe la columna y cómo reorganizar las columnas en el marco de datos R?
subset columnas en r (6)
¿Cómo agrego una columna en medio de un marco de datos R? Quiero ver si tengo una columna llamada "Apellido" y luego agregarla como la tercera columna si aún no existe.
1) Prueba de existencia: use% en% en los nombres de los colonos, por ejemplo
> example(data.frame) # to get ''d''
> "fac" %in% colnames(d)
[1] TRUE
> "bar" %in% colnames(d)
[1] FALSE
2) Básicamente, debe crear un nuevo data.frame de la primera mitad de la columna anterior, su nueva columna y la segunda mitad:
> bar <- data.frame(d[1:3,1:2], LastName=c("Flim", "Flom", "Flam"), fac=d[1:3,3])
> bar
x y LastName fac
1 1 1 Flim C
2 1 2 Flom A
3 1 3 Flam A
>
De las muchas funciones de ayuda que he escrito, esto se usa cada vez que cargo R. Solo hace una lista de los nombres de las columnas y los índices, pero lo uso constantemente.
##creates an object from a data.frame listing the column names and location
namesind=function(df){
temp1=names(df)
temp2=seq(1,length(temp1))
temp3=data.frame(temp1,temp2)
names(temp3)=c("VAR","COL")
return(temp3)
rm(temp1,temp2,temp3)
}
ni <- namesind
Usa ni para ver los números de tus columnas. (ni es solo un alias para namesind, nunca uso namesind pero pensé que originalmente era un nombre mejor) Luego, si desea insertar su columna en la posición 12, y su data.frame se llama bob con 20 columnas, sería
bob2 <- data.frame (bob [, 1: 11], nueva columna, bob [, 12: 20]
aunque me gustó el complemento al final y reordenar la respuesta de Hadley también.
La respuesta de Dirk Eddelbuettel funciona, pero no es necesario indicar números de fila ni especificar entradas en la columna de apellido. Este código debería hacerlo para un marco de datos llamado df
:
if(!("LastName" %in% names(df))){
df <- cbind(df[1:2],LastName=NA,df[3:length(df)])
}
(este valor predeterminado es LastName
to NA
, pero podría usar " LastName=''Smith''
" con la misma facilidad)
Siempre pensé que algo como append () [aunque desafortunado el nombre es] debería ser una función genérica
## redefine append() as generic function
append.default <- append
append <- `body<-`(args(append),value=quote(UseMethod("append")))
append.data.frame <- function(x,values,after=length(x))
`row.names<-`(data.frame(append.default(x,values,after)),
row.names(x))
## apply the function
d <- (if( !"LastName" %in% names(d) )
append(d,values=list(LastName=c("Flim","Flom","Flam")),after=2) else d)
Un enfoque es simplemente agregar la columna al final del marco de datos, y luego usar el subconjunto para moverlo a la posición deseada:
d$LastName <- c("Flim", "Flom", "Flam")
bar <- d[c("x", "y", "Lastname", "fac")]
o utilizando cbind:
> example(data.frame) # to get ''d''
> bar <- cbind(d[1:3,1:2],LastName=c("Flim", "Flom", "Flam"),fac=d[1:3,3])
> bar
x y LastName fac
1 1 1 Flim A
2 1 2 Flom B
3 1 3 Flam B