给出以下数据框:
> 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
但是,在结果数据框中,列按字母顺序排列,我不希望这样。
有人知道如何解决订购问题吗?
非常感谢提前!
答案 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