如何通过行名重新排列小标题

时间:2019-05-16 18:39:09

标签: r dataframe tidyverse tibble rowname

传统数据框支持按行名重新排列行:

> 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

涉及小标题时,由于它放弃了行名的概念,所以我想知道达到类似目标的标准方法是什么。

> 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"), ]

,即子集和重新排列数据框的行。

1 个答案:

答案 0 :(得分:1)

如joran所述,您可以使用过滤器选择感兴趣的行,然后以手动定义的特定顺序排列小标题,可以将arrangefactor配合使用:

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