Традиционные кадры данных поддерживают переупорядочивание строк по именам строк:
> 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
Но кажется неуклюжим. У кого-нибудь есть идея получше?
В более общем смысле мой вопрос можно перефразировать так: по синтаксису tidyverse какой самый аккуратный и быстрый эквивалент
df[c("x3", "x1"), ]
то есть подмножество и перестановка строк фрейма данных.
Позвонить arrange, чтобы оформить по rowname колонке? Или происходит что-то более сложное, и я это упускаю?
Я до сих пор не понимаю, почему вы не используете просто filter(), как с любой другой переменной, если вы уже используете таблички.
@joran, AFAIK, кажется, что filter не сохраняет результаты в указанном порядке...
Нет, для этого есть отдельная команда arrange.
Привет @camille @joran, текущая проблема заключается в том, что arrange может сортировать столбец (в порядке возрастания или убывания), но не упорядочивать его в произвольном порядке (например, «x3», «x1»).
Если вы пытаетесь получить строки по положению, используйте dplyr::slice. Или filter с %in%
Спасибо @camille, но как вообще получить позицию с dplyr?
Если вам нужны строки 3 и 1 из df, это slice(df, c(3, 1)). Или отфильтруйте по столбцу имени строки
Извините, @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 плюс порядковый множитель, и снова я хотел посмотреть, есть ли другие элегантные альтернативы. Подводя итог, боюсь, ни один из ваших ответов не соответствует моей точке зрения.





Как описал Джоран, вы можете использовать фильтр для выбора интересующих строк, а затем упорядочить таблицу в определенном порядке, определенном вручную, вы можете использовать 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")))
Я не уверен, что понимаю... как только вы преобразуете его в обычный столбец, вы можете изменить порядок или подмножество на основе значений в этом столбце, как и любой другой.