12

我想在我的数据框中添加一个带有“NA”的新列:

     A       B
1    14379  32094
2   151884  174367
3   438422  449382

但我需要它位于上校之间。A和B,像这样:

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

我知道如何添加 col。上校之后的 C。B,但这对我没有帮助......有人知道怎么做吗?

4

4 回答 4

26

通过 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
于 2013-04-11T19:19:18.220 回答
5

如果您使用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'))
于 2013-04-12T00:11:05.757 回答
3

您还可以使用包 tibble,它有一个非常有趣的功能(以及许多其他功能):add_column()

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

该函数易于使用,您可以使用参数 .before 代替。

于 2016-11-24T14:33:32.803 回答
1

我编写了一个函数来将列附加到(到)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))

于 2014-11-21T12:39:51.750 回答