Добавить новый столбец между другими столбцами данных

Я хочу добавить новый столбец с "NA" в моем фреймворке данных:

     A       B
1    14379  32094
2   151884  174367
3   438422  449382

Но мне нужно, чтобы он находился между col. A и B, например:

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

Я знаю, как добавить col. C после col. B, но это мне не помогает... Кто-нибудь знает, как это сделать?

Ответ 1

В 2 этапа вы можете изменить порядок столбцов:

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

Вы также можете использовать 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

Ответ 2

Если вы используете data.table, вы можете использовать функцию setcolorder. Обратите внимание, что NA хранится как логическая переменная, если вы хотите, чтобы столбец был инициирован как целочисленный, двойной или столбец символов, вы можете использовать NA_integer, NA_real_ или NA_character_

например,

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

Вы можете сделать это в одной строке

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

Ответ 3

Вы также можете использовать пакетный заголовок, который имеет очень интересную функцию (среди многих других) для этого: add_column()

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

Эта функция проста в использовании, и вы можете использовать аргумент. вместо этого.

Ответ 4

Я написал функцию добавления столбцов на (в) data.frame. Он также позволяет вам называть столбец и выполняет несколько проверок...

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

примеры:

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

(Одно из преимуществ вызова cbind в конце функции и индексирования состоит в том, что символы внутри data.frame не принуждаются к факторам, как это было бы при использовании as.data.frame(append(x, cols, after=ind)))