我有一个具有以下列名称的数据框:
# 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开头。另外,该数据集在其可能具有的列数方面是可变的,因此我不想使用特定的数字对其进行索引。
谢谢!
答案 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”之后。