2013-04-11 11 views
12

Chcę dodać nową kolumnę „NA” jest w moim dataframe:Dodaj nową kolumnę między innymi dataframe kolumn

 A  B 
1 14379 32094 
2 151884 174367 
3 438422 449382 

Ale muszę to być zlokalizowany między płk. A i B, tak:

 A  C  B 
1 14379 NA 32094 
2 151884 NA 174367 
3 438422 NA 449382 

Wiem, jak dodać kol. C po kol. B, ale to mi nie pomoże ... Czy ktoś wie, jak to zrobić?

Odpowiedz

23

w 2 krokach, można zmienić kolejność kolumn:

dat$C <- NA 
dat <- dat[, c("A", "C", "B")] 
     A C   B 
1 0.596068 NA -0.7783724 
2 -1.464656 NA -0.8425972 

Można również użyć append

dat <- data.frame(A = rnorm(2), B = rnorm(2)) 
as.data.frame(append(dat, list(C = NA), after = 1)) 

      A C   B 
1 -0.7046408 NA 0.2117638 
2 0.8402680 NA -2.0109721 
5

Jeśli używasz data.table można użyć funkcji setcolorder. Zauważ, że NA jest przechowywana jako zmienna logiczna, jeśli chcesz mieć kolumnę zainicjowany jako liczba całkowita, podwójne lub postaci kolumny, można użyć NA_integer, NA_real_ lub NA_character_

np

library(data.table) 
DT <- data.table(DF) 
# add column `C` = NA 

DT[, C := NA] 

setcolorder(DT, c('A','C','B')) 
DT 
##   A C  B 
## 1: 14379 NA 32094 
## 2: 151884 NA 174367 
## 3: 438422 NA 449382 

Można to zrobić w jednym wierszu:

setcolorder(DT[, C: = NA], c('A','B','C')) 
1

Napisałem funkcję dodawania kolumn do (do) danych.frame. To pozwala wymienić kolumnę, jak również i robi kilka kontrole ...

append_col <- function(x, cols, after=length(x)) { 
    x <- as.data.frame(x) 
    if (is.character(after)) { 
     ind <- which(colnames(x) == after) 
     if (any(is.null(ind))) stop(after, "not found in colnames(x)\n") 
    } else if (is.numeric(after)) { 
     ind <- after 
    } 
    stopifnot(all(ind <= ncol(x))) 
    cbind(x, cols)[, append(1:ncol(x), ncol(x) + 1:length(cols), after=ind)] 
} 

przykładów:

# create data 
df <- data.frame("a"=1:5, "b"=6:10) 

# append column 
append_col(df, list(c=1:5)) 

# append after an column index 
append_col(df, list(c=1:5), after=1) 

# or after a named column 
append_col(df, list(c=1:5), after="a") 

# multiple columns/single values work as expected 
append_col(df, list(c=NA, d=4:8), after=1) 

(Zaletą nazywając cbind na końcu funkcji i indeksowanie jest to, że znaków w obrębie data.frame nie są zmuszane do czynników, jak byłoby w przypadku, gdyby przy użyciu as.data.frame(append(x, cols, after=ind)))

3

można również użyć tibble pakiet, który ma bardzo ciekawą funkcję (wśród wielu innych) dla tego: add_column()

library(tibble) 
df <- data.frame("a" = 1:5, "b" = 6:10) 
add_column(df, c = rep(NA, nrow(df)), .after = 1) 

Ta funkcja jest łatwa w użyciu i można zamiast niej użyć argumentu .przedtem.

Powiązane problemy