2013-04-11 63 views
12

Tôi muốn thêm một cột mới với "NA" s trong dataframe tôi:Thêm một cột mới giữa cột dataframe khác

 A  B 
1 14379 32094 
2 151884 174367 
3 438422 449382 

Nhưng tôi cần nó để được nằm giữa col. A và B, như sau:

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

Tôi biết cách thêm col. C sau col. B, nhưng đó không phải là hữu ích cho tôi ... Bất cứ ai cũng biết làm thế nào để làm điều đó?

Trả lời

23

Trong 2 bước, bạn có thể sắp xếp lại các cột:

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

Bạn cũng có thể sử dụng 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

Nếu bạn sử dụng data.table bạn có thể sử dụng chức năng setcolorder. Lưu ý rằng NA được lưu giữ như biến logic, nếu bạn muốn có cột bắt đầu như một số nguyên, cột đôi hoặc nhân vật, bạn có thể sử dụng NA_integer, NA_real_ hay NA_character_

ví dụ

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 

Bạn có thể làm điều này trong một dòng

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

Tôi đã viết một hàm để nối thêm cột vào (vào) một data.frame. Nó cho phép bạn đặt tên cho cột là tốt, và thực hiện một vài kiểm tra ...

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)] 
} 

ví dụ:

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

(Một lợi thế của gọi cbind vào cuối của hàm và lập chỉ mục là các ký tự trong data.frame không bị ép buộc bởi các yếu tố như trường hợp nếu sử dụng as.data.frame(append(x, cols, after=ind)))

3

Bạn cũng có thể sử dụng gói tibble, có chức năng rất thú vị (trong số nhiều khác) cho: add_column()

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

Chức năng đó rất dễ sử dụng và bạn có thể sử dụng đối số. Trước khi thay thế.

Các vấn đề liên quan