R中的交换(选定/子集)数据帧列

时间:2014-10-19 08:50:05

标签: r dataframe

可以在R中的数据框中交换所选列子集的顺序的最简单方法是什么。我看到的答案(Is it possible to swap columns around in a data frame using R?)使用所有索引/列名称。如果有一列,比如100列,则需要:1)将第99列与第1列交换,或2)在第1列之前移动第99列(但将第1列保留为第2列),建议的方法看起来很麻烦。有趣的是,周围没有小包装(Wickham的“重塑”?) - 或者可以建议一个简单的代码?

1 个答案:

答案 0 :(得分:3)

如果你真的想要一个快捷方式,你可以编写几个简单的函数,如下所示。

要交换两列的位置:

swapcols <- function(x, col1, col2) {
  if(is.character(col1)) col1 <- match(col1, colnames(x))
  if(is.character(col2)) col2 <- match(col2, colnames(x))
  if(any(is.na(c(col1, col2)))) stop("One or both columns don't exist.")
  i <- seq_len(ncol(x))
  i[col1] <- col2
  i[col2] <- col1
  x[, i]
}

将列从一个位置移动到另一个位置:

movecol <- function(x, col, to.pos) {
  if(is.character(col)) col <- match(col, colnames(x))
  if(is.na(col)) stop("Column doesn't exist.")
  if(to.pos > ncol(x) | to.pos < 1) stop("Invalid position.")
  x[, append(seq_len(ncol(x))[-col], col, to.pos - 1)]
}

以下是各自的例子:

(m <- matrix(1:12, ncol=4, dimnames=list(NULL, letters[1:4])))

#      a b c  d
# [1,] 1 4 7 10
# [2,] 2 5 8 11
# [3,] 3 6 9 12

swapcols(m, col1=1, col2=3) # using column indices

#      c b a  d
# [1,] 7 4 1 10
# [2,] 8 5 2 11
# [3,] 9 6 3 12

swapcols(m, 'd', 'a') # or using column names

#       d b c a
# [1,] 10 4 7 1
# [2,] 11 5 8 2
# [3,] 12 6 9 3

movecol(m, col='a', to.pos=2)
#      b a c  d
# [1,] 4 1 7 10
# [2,] 5 2 8 11
# [3,] 6 3 9 12