2009-07-24 13 views

risposta

17

1) Test per esistenza: utilizzare% in% sui nomi dei nomi, ad es.

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

2) Bisogna in sostanza, di creare un nuovo data.frame della prima metà del vecchio, la nuova colonna, e la seconda metà:

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

Mi consiglia di non usare cbind come la semantica sono piuttosto complicati: a seconda dell'input potresti ottenere una matrice o una data.frame – hadley

23

Un approccio è quello di aggiungere la colonna alla fine del frame di dati e quindi utilizzare il sottotitolo per spostarlo nella posizione desiderata:

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

Bella! Non avevo visto quel trucco. E puoi riassegnarlo direttamente anche a d. –

+0

Vorrei poter combinare questa risposta con Dirk in alto o selezionarli entrambi come risposta selezionata. Questo è così ovvio che mi prendo a calci per non pensarci! –

+0

Grazie è molto utile –

2

Delle tante stupide funzioni di helper che ho scritto, questo viene usato ogni volta che carico R. Fa solo un elenco dei nomi delle colonne e degli indici, ma io lo uso costantemente.

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

Utilizzare ni per visualizzare i numeri di colonna. (ni è solo un alias per namesind, non uso mai namesind ma pensavo fosse in origine un nome migliore) Quindi se vuoi inserire la colonna in dire, posizione 12, e data.frame è chiamata bob con 20 colonne, sarebbe .

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

anche se mi piaceva l'add alla fine e riorganizzare risposta da Hadley pure

1

Ho sempre pensato qualcosa come append() [anche se sfortunato il nome è] dovrebbe essere una funzione generica

## 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 risposta di Dirk Eddelbuettel funziona, ma non è necessario indicare numeri di riga o specificare voci nella colonna dell'ultimo nome. Questo codice dovrebbe farlo per un frame di dati di nome df:

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

(il valore predefinito LastName-NA, ma si potrebbe facilmente utilizzare "LastName='Smith'")

Problemi correlati