dplyr ::总结字母顺序,但我需要原始顺序

时间:2018-12-04 23:36:51

标签: r dplyr tidyverse

library(tidyverse)

我有一串字母和单词:

myletters <- c("A", "A", "B", "C", "C", "C", "C", "AA", "BB", "BB")

我想对每个字母进行计数,并按原始顺序排列。 所有类似字母和字母词的组将被分组在原始字符串中……它们永远不会被混合。例如,这将永远不会发生:

mylettersNever <- c("A", "B", "A", "C", "C", "C", "C", "AA", "BB", "BB")

我使用table()尝试了一些操作,但是它与以下代码相同。 这不起作用:

myletters %>%
  tibble(letters = .) %>%
  group_by(letters) %>%
  summarise(n = n())

...因为输出是

# A tibble: 5 x 2
  letters     n
  <chr>   <int>
1 A           2
2 AA          1
3 B           1
4 BB          2
5 C           4

...但是我想要:

# A tibble: 5 x 2
  letters     n
  <chr>   <int>
1 A           2
2 B           1
3 C           4
4 AA          1
5 BB          2

帮助?

2 个答案:

答案 0 :(得分:3)

您可以使用count()根据某个变量进行计数。确实,要保持秩序,将角色列视为因素将有助于维持秩序

library(tidyverse)
myletters <- c("A", "A", "B", "C", "C", "C", "C", "AA", "BB", "BB")

tibble(letters = myletters) %>%
  mutate(letters = as_factor(letters)) %>%
  count(letters)
#> # A tibble: 5 x 2
#>   letters     n
#>   <fct>   <int>
#> 1 A           2
#> 2 B           1
#> 3 C           4
#> 4 AA          1
#> 5 BB          2

reprex package(v0.2.1)于2018-12-05创建

答案 1 :(得分:1)

这是一种骇人听闻的方法,但是可以工作。基本上根据最先出现的那一个为每个组分配一个id列,然后在汇总后删除id。另外,您可以直接使用count在幕后分组和取消分组。

myletters %>%
  tibble(letters = .) %>%
  count(id = match(letters, unique(letters)), letters) %>%
  select(-id)

# A tibble: 5 x 2
  letters     n
  <chr>   <int>
1 A           2
2 B           1
3 C           4
4 AA          1
5 BB          2