按以R结尾的数字顺序排列列

时间:2019-07-08 17:44:32

标签: r sorting dplyr

我有一个具有以下列名称的数据框:

# A tibble: 1 x 5
  name  item2 item3 item1 item12
  <lgl> <lgl> <lgl> <lgl> <lgl> 
1 NA    NA    NA    NA    NA

我希望各列按产品编号的正确顺序排列。

我尝试使用

problem %>% select(everything(), order(contains("item")))

但这不起作用。

我的实际数据集有很多列,所以我不能只输入它;但是,这些许多列中的每一个都以item开头。另外,该数据集在其可能具有的列数方面是可变的,因此我不想使用特定的数字对其进行索引。

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用gtools :: mixedorder按字符值对其数字分量进行排序

library(gtools)
df[order(grepl('item', names(df)), order(mixedorder(names(df))))]
# or
df[mixedorder(paste0(grepl('item', names(df)), names(df)))]

#   name item1 item2 item3 item12
# 1   NA    NA    NA    NA     NA

或在基数R(相同的输出)中

df[order(grepl('item', names(df)), as.numeric(gsub('[^1-9]', '', names(df))))]

使用的数据:

df <- matrix(NA, 1, 5)
colnames(df) <- c('name', paste0('item', c(2, 3, 1, 12)))
df <- as.data.frame(df)

答案 1 :(得分:1)

您可以使用regexpr

d <- cbind(d[1], d[-1][order(as.numeric(regmatches(names(d)[-1], 
                                                   regexpr("\\d+", names(d)[-1]))))])
d
#   name item1 item2 item3 item12
# 1   NA    NA    NA    NA     NA

数据

d <- structure(list(name = NA, item2 = NA, item3 = NA, item1 = NA, 
    item12 = NA), row.names = c(NA, -1L), class = "data.frame")

答案 2 :(得分:0)

Base R解决方案:

problem[,c(grep("item",names(problem),value=TRUE,invert=TRUE), sort(grep("item",names(problem),value=TRUE)))]

这将为您提供一个df,该df以所有不包含“ item”的列开头,然后是按字母顺序排列的“ item”列。请注意,如果您有10个或更多的案例,并且前9个是“ item1”等,则“ item2”将在“ item19”之后。