2009-07-24 14 views

Odpowiedz

17

1) Test na istnienie: Użyj% w% na nazwach zmiennych, np.

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

2) można zasadniczo trzeba utworzyć nowy data.frame z pierwszej połowy starego, nowego kolumnie, a drugą połowę:

> 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

lub używając 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

Polecam przed użyciem cbind jako semantyki są dość skomplikowane: w zależności od danych wejściowych możesz otrzymać macierz lub dane.rame – hadley

23

Jednym z podejść jest dodanie kolumny do końca ramki danych, a następnie użycie podzbioru w celu przeniesienia go do żądanej pozycji:

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

Niezły! Nie widziałem tej sztuczki. Możesz też bezpośrednio przypisać ją do d również. –

+0

Chciałbym połączyć tę odpowiedź z powyższym Dirkiem lub wybrać obie jako wybraną odpowiedź. Jest to tak oczywiste, że się rzucam, bo o tym nie myślę! –

+0

To bardzo przydatne –

2

Spośród wielu głupich małych funkcji pomocniczych, które napisałem, to jest używane za każdym razem, gdy ładuję R. Po prostu tworzy listę nazw kolumn i indeksów, ale ciągle go używam.

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

Użyj ni, aby zobaczyć swoje numery kolumn. (ni jest po prostu aliasem dla namesind, nigdy nie używam namesind ale myślałem, że to było lepsze imię na początku) Następnie jeśli chcesz wstawić twoją kolumnę powiedzmy, pozycja 12, a twoja data.frame nazywa się Bob z 20 kolumnami, to byłoby .

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

chociaż lubił dodatek na końcu i zmienić odpowiedź od Hadley oraz

1

Zawsze myślałem, że coś takiego jak append() [choć niefortunne jest to nazwisko] powinno być ogólną funkcją

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

Odpowiedź Dirka Eddelbuettela działa, ale nie trzeba podawać numerów wierszy ani podawać wpisów w kolumnie nazwiska. Ten kod powinien to zrobić dla ramki danych o nazwie df:

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

(to domyślne LastName do NA, ale można równie dobrze użyć „LastName='Smith'”)

Powiązane problemy