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
帮助?
答案 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