使用以下示例数据帧:

a <-  c(1:5)
b <- c("Cat", "Dog", "Rabbit", "Cat", "Dog")
c <- c("Dog", "Rabbit", "Cat", "Dog", "Dog")
d <- c("Rabbit", "Cat", "Dog", "Dog", "Rabbit")
e <- c("Cat", "Dog", "Dog", "Rabbit", "Cat")
f <- c("Cat", "Dog", "Dog", "Rabbit", "Cat")

df <- data.frame(a,b,c,d,e,f)

我想研究如何在不必输入所有列名的情况下对列进行重新排序,例如df[,c("a","d","e","f","b","c")]

我怎么说我想要f列之后的b列和c列呢?(仅引用要移动的列或列范围?).

非常感谢您的帮助.

r

推荐答案

如果只是将某些列移到末尾,可以创建一个小助手函数,如下所示:

movetolast <- function(data, move) {
  data[c(setdiff(names(data), move), move)]
}

movetolast(df, c("b", "c"))
#   a      d      e      f      b      c
# 1 1 Rabbit    Cat    Cat    Cat    Dog
# 2 2    Cat    Dog    Dog    Dog Rabbit
# 3 3    Dog    Dog    Dog Rabbit    Cat
# 4 4    Dog Rabbit Rabbit    Cat    Dog
# 5 5 Rabbit    Cat    Cat    Dog    Dog

我建议大家养成使用列位置的习惯,尤其不是从程序的Angular ,因为这些位置可能会改变.


"为了好玩"更新

下面是对上述函数的扩展解释.它允许您将列移动到第一个或最后一个位置,或在另一列之前或之后.

moveMe <- function(data, tomove, where = "last", ba = NULL) {
  temp <- setdiff(names(data), tomove)
  x <- switch(
    where,
    first = data[c(tomove, temp)],
    last = data[c(temp, tomove)],
    before = {
      if (is.null(ba)) stop("must specify ba column")
      if (length(ba) > 1) stop("ba must be a single character string")
      data[append(temp, values = tomove, after = (match(ba, temp)-1))]
    },
    after = {
      if (is.null(ba)) stop("must specify ba column")
      if (length(ba) > 1) stop("ba must be a single character string")
      data[append(temp, values = tomove, after = (match(ba, temp)))]
    })
  x
}

try 以下方法.

moveMe(df, c("b", "c"))
moveMe(df, c("b", "c"), "first")
moveMe(df, c("b", "c"), "before", "e")
moveMe(df, c("b", "c"), "after", "e")

您需要调整它以进行一些错误判断——例如,如果您try 将列"b"和"c"移动到"c"之前,您(显然)会得到一个错误.

R相关问答推荐

在 tibble R 的截止范围内随机采样

如何绘制具有与正数相同 colored颜色 形状的负数条?

在数据框中求和,条件来自另一列

如何做每列报告的最新值的新数据框?

如何用来自lower.tri的匹配整数填充矩阵的upper.tri?

如何求和每个月和年的值总数并通过 R 中的其他列加入

当新列名作为字符向量给出时,在“data.table”中对数据进行分组的好方法

如何计算R中每一行的每一列的周期总和

使用mutate_all和cross时如何在case_when中添加列名?

如何用R绘制双坐标CDF和PDF

在R中,在数字字符串的正确位置添加逗号

考虑到 position='dodge' 的条形,如何在柱状条形图上添加线条,其中线条通过条形的中间顶部?

R包stargazer产生两个表输出而不是一个

R - 根据模式和条件删除字符串列中的子字符串

如何使用 cross 和 .names 参数将此基本 R 代码转换为 dplyr

如何让我的数据正确呈现?

new.session() 中的错误:5 次try 后无法建立会话

查找 R 中两个时间戳之间的重叠以分配班次

使用箭头分配函数作为 R purrr map2

如何将变量值映射到图案填充 - ggplot / ggpattern (