Традиционные кадры данных поддерживают переупорядочивание строк по именам строк:
> 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"), ]
то есть подмножество и перестановка строк фрейма данных.
arrange
, чтобы расположить по столбцуrowname
? Или происходит что-то более сложное, и я это пропустил? - person camille   schedule 16.05.2019filter()
, как с любой другой переменной, если вы уже используете таблички. - person joran   schedule 16.05.2019filter
не сохраняет результаты в указанном порядке... - person foehn   schedule 16.05.2019arrange
. - person joran   schedule 16.05.2019arrange
может сортировать столбец (в порядке возрастания или убывания), но не упорядочивать его в произвольном порядке (например, x3, x1). - person foehn   schedule 16.05.2019dplyr::slice
. Илиfilter
с%in%
- person camille   schedule 17.05.2019dplyr
? - person foehn   schedule 17.05.2019df
, этоslice(df, c(3, 1))
. Или отфильтруйте по столбцу имени строки - person camille   schedule 17.05.2019slice(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