Добавить новый столбец между другими столбцами данных
Я хочу добавить новый столбец с "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))
)