Как переупорядочить табличку по именам строк

Традиционные кадры данных поддерживают переупорядочивание строк по именам строк:

> df <- data.frame(c1 = letters[1:3], c2 = 1:3, row.names = paste0("x", 1:3))
> df
   c1 c2
x1  a  1
x2  b  2
x3  c  3

#' If we want, say, row "x3" and "x1":
> df[c("x3", "x1"), ]
   c1 c2
x3  c  3
x1  a  1

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

> tb <- as_tibble(rownames_to_column(df))
> tb
# A tibble: 3 x 3
  rowname c1       c2
  <chr>   <fct> <int>
1 x1      a         1
2 x2      b         2
3 x3      c         3
> ? 

Спасибо.

Обновлять

Я могу предложить следующее решение:

> tb[match(c("x3", "x1"), tb[["rowname"]]), ]
# A tibble: 2 x 3
  rowname c1       c2
  <chr>   <fct> <int>
1 x3      c         3
2 x1      a         1

Но кажется неуклюжим. У кого-нибудь есть идея получше?

Обновление 2

В более общем смысле мой вопрос можно перефразировать так: по синтаксису tidyverse что является наиболее аккуратным и быстрым эквивалентом

df[c("x3", "x1"), ]

то есть подмножество и перестановка строк фрейма данных.


person foehn    schedule 16.05.2019    source источник
comment
Я не уверен, что понимаю... как только вы преобразуете его в обычный столбец, вы можете изменить порядок или подмножество на основе значений в этом столбце, как и любой другой.   -  person joran    schedule 16.05.2019
comment
Позвонить arrange, чтобы расположить по столбцу rowname? Или происходит что-то более сложное, и я это пропустил?   -  person camille    schedule 16.05.2019
comment
Я до сих пор не понимаю, почему вы не используете filter(), как с любой другой переменной, если вы уже используете таблички.   -  person joran    schedule 16.05.2019
comment
@joran, AFAIK, кажется, что filter не сохраняет результаты в указанном порядке...   -  person foehn    schedule 16.05.2019
comment
Нет, для этого есть отдельная команда arrange.   -  person joran    schedule 16.05.2019
comment
Привет @camille @joran, текущая проблема заключается в том, что arrange может сортировать столбец (в порядке возрастания или убывания), но не упорядочивать его в произвольном порядке (например, x3, x1).   -  person foehn    schedule 16.05.2019
comment
Если вы пытаетесь получить строки по положению, используйте dplyr::slice. Или filter с %in%   -  person camille    schedule 17.05.2019
comment
Спасибо, @camille, но как вообще получить позицию с dplyr?   -  person foehn    schedule 17.05.2019
comment
Если вам нужны строки 3 и 1 из df, это slice(df, c(3, 1)). Или отфильтруйте по столбцу имени строки   -  person camille    schedule 17.05.2019
comment
Извините, @camille, чтобы использовать slice(df, c(3, 1)), мы должны знать, где находятся x3 и x1, поэтому сначала нам нужно сопоставить c("x3" , "x1") с c(3, 1). В моем рабочем примере я использовал match и надеялся, что кто-нибудь покажет мне что-нибудь получше. С другой стороны, filter(rowname %in% c("x3", "x1")), как показал ответ @joshpk, не соблюдал определенный порядок (сначала x3, затем x1). Для этого @joshpk применил оригинальный трюк с дополнительным arrange плюс порядковый множитель, и опять же, я хотел посмотреть, есть ли другие элегантные альтернативы. Подводя итог, боюсь, ни один из ваших ответов не соответствует моей точке зрения.   -  person foehn    schedule 17.05.2019


Ответы (1)


Как описал Джоран, вы можете использовать фильтр для выбора интересующих строк, а затем упорядочить таблицу в определенном порядке, определенном вручную, вы можете использовать arrange с factor:

tibble(rowname = paste0("x", 1:3), c1 = letters[1:3], c2 = 1:3) %>%
  filter(rowname %in% c("x3", "x1")) %>%
  arrange(factor(rowname, levels = c("x3", "x1")))
person joshpk    schedule 16.05.2019