расставить столбцы по порядку по номеру, оканчивающемуся на R - PullRequest
0 голосов
/ 08 июля 2019

У меня есть фрейм данных с этими именами столбцов:

# 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")))

Но это не работает.

В моем фактическом наборе данных много столбцов, поэтому я не могу его просто напечатать;однако каждый из этих многочисленных столбцов начинается с элемента.Кроме того, набор данных является переменным по количеству столбцов, которые он может иметь, поэтому я не хочу индексировать его с конкретными номерами.

Спасибо!

Ответы [ 3 ]

1 голос
/ 08 июля 2019

Вы можете использовать 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 голос
/ 08 июля 2019

Вы можете использовать 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")
0 голосов
/ 08 июля 2019

Базовый раствор R:

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

Это даст вам df, который начинается со всех столбцов, которые не содержат «item», за которыми следуют столбцы «item», отсортированные по алфавиту. Обратите внимание, что если у вас есть 10 или более случаев, а первые девять - это «item1» и т. Д., То «item2» будет следовать после «item19».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...