insertar - ¿Cómo agregar una nueva columna entre otras columnas de dataframe?
seleccionar datos en r (4)
En 2 pasos, puede reordenar las columnas:
dat$C <- NA
dat <- dat[, c("A", "C", "B")]
A C B
1 0.596068 NA -0.7783724
2 -1.464656 NA -0.8425972
También puedes usar 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
Quiero agregar una nueva columna con "NA" en mi marco de datos:
A B
1 14379 32094
2 151884 174367
3 438422 449382
Pero necesito que esté ubicado entre col. A y B, como este:
A C B
1 14379 NA 32094
2 151884 NA 174367
3 438422 NA 449382
Sé cómo agregar col. C después de col. B, pero eso no es útil para mí ... ¿Alguien sabe cómo hacerlo? ¡¡¡Gracias!!!
Escribí una función para anexar columnas sobre (en) un data.frame. También le permite nombrar la columna, y hace algunas comprobaciones ...
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)]
}
ejemplos:
# 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)
(Una ventaja de invocar cbind al final de la función e indización es que los caracteres dentro del data.frame no se fuerzan a factores como sería el caso si se usa as.data.frame(append(x, cols, after=ind))
)
Si usa data.table
puede usar la función setcolorder
. Tenga en cuenta que NA
se almacena como variable lógica, si desea que la columna se inicie como una columna entera, doble o de caracteres, puede usar NA_integer
, NA_real_
o NA_character_
p.ej
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
Podrías hacer esto en una línea
setcolorder(DT[, C: = NA], c(''A'',''B'',''C''))
También puedes usar el paquete tibble, que tiene una función muy interesante (entre muchas otras) para eso: add_column ()
library(tibble)
df <- data.frame("a" = 1:5, "b" = 6:10)
add_column(df, c = rep(NA, nrow(df)), .after = 1)
Esa función es fácil de usar, y puede usar el argumento .antes de hacerlo.