按列索引插入列(未更改的列顺序)

时间:2015-07-23 09:20:10

标签: r

给出以下数据框:

> header = c("A1","A2","A3","B1","B2","B3","AB1", "AB2", "AB3")
> df = matrix(c(0,0,0,0,0,0,0,0,0),nrow = 1)
> colnames(df) = header
> df
     A1 A2 A3 B1 B2 B3 AB1 AB2 AB3
[1,]  0  0  0  0  0  0   0   0   0

我知道包含" 2"的标题的列索引号。由:

> index2 = grep("2", colnames(df))
> index2
[1] 2 5 8

我想添加两个名为" A2.1"," A2.2"," B2.1"," B2的额外列。 2"等等(或允许我区分它们的另一种命名法)在索引为2,5和8的列旁边,以便:

     A1 A2 A2.1 A2.2 A3 B1 B2 B2.1 B2.2 B3 AB1 AB2 AB2.1 AB2.2 AB3
[1,]  0  0  0  0  0  0  0  0  0    0    0    0   0     0     0   0

我在以下帖子中解决了类似的问题:Insert columns by column index

但是,在结果数据框中,列按字母顺序排列,我不希望这样。

有人知道如何解决订购问题吗?

非常感谢提前!

1 个答案:

答案 0 :(得分:4)

我会采用不同的方法。我不会复制列,而是将我需要的列子集几次(在这种情况下为3次)。这样就可以存储列的顺序。

创建子集索引

indx <- unlist(lapply(1:ncol(df), function(x) if(x %in% index2) rep(x, 3) else x))
## [1] 1 2 2 2 3 4 5 5 5 6 7 8 8 8 9

设置列并重命名

df1 <- df[, indx, drop = FALSE]
colnames(df1) <- make.unique(colnames(df1))
df1
#      A1 A2 A2.1 A2.2 A3 B1 B2 B2.1 B2.2 B3 AB1 AB2 AB2.1 AB2.2 AB3
# [1,]  0  0    0    0  0  0  0    0    0  0   0   0     0     0   0