2009-07-24 15 views

Respuesta

17

1) Prueba de existencia: use% en% en los colnames, p.

> example(data.frame) # to get 'd' 
> "fac" %in% colnames(d) 
[1] TRUE 
> "bar" %in% colnames(d) 
[1] FALSE 

2) Usted esencialmente tiene que crear una nueva hoja.de.datos de la primera mitad de la edad, 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 
> 
1

o el uso de 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 
+0

lo recomiendo contra el uso de cbind como la semántica son bastante complicadas: dependiendo de la entrada, puede obtener una matriz o un data.frame – hadley

23

Un enfoque es simplemente añadir la columna hasta el final de la trama de datos, y luego utilizar subconjuntos para moverlo a la posición deseada:

d$LastName <- c("Flim", "Flom", "Flam") 
bar <- d[c("x", "y", "Lastname", "fac")] 
+0

¡Bonito! No había visto ese truco. Y también puede reasignarlo directamente a d. –

+0

Ojalá pudiera combinar esta respuesta con la anterior de Dirk o seleccionarlas como la respuesta seleccionada. ¡Esto es tan obvio que me di una patada por no pensar en eso! –

+0

Gracias eso es muy útil –

2

De las muchas pequeñas funciones de ayuda que he escrito, esto se usa cada vez que cargo R. Simplemente hace una lista de los nombres e índices de columna, pero la 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 

uso ni para ver los números de las columnas. (ni es solo un alias para namesind, nunca uso namesind pero pensé que era un nombre mejor originalmente) Luego, si quieres insertar tu columna en digamos, posición 12, y tu data.frame se llama bob con 20 columnas, sería .

bob2 < - data.frame (bob [, 1: 11], newcolumn, bob [, 12: 20]

aunque me ha gustado el complemento en el extremo y reorganizar respuesta de Hadley, así

1

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

La respuesta de Dirk Eddelbuettel funciona, pero no necesita indicar números de fila ni especificar entradas en la columna de apellido. Este código debe hacerlo por una trama de datos llamado df:

if(!("LastName" %in% names(df))){ 
    df <- cbind(df[1:2],LastName=NA,df[3:length(df)]) 
} 

(el valor predeterminado es LastName-NA, pero se puede utilizar con la misma facilidad "LastName='Smith'")

Cuestiones relacionadas