(编辑:数据标签并不总是三的倍数) 考虑如下数据:
some_tags <- c("cat|hat",
"cat|hat|hog",
"cat|bat",
"bat|hat|dog",
"rat")
set.seed(2)
data.frame(clusters=sample.int(3, 5,replace = T),
tag=some_tags)
结果数据框为
clusters tag
1 1 cat|hat
2 3 cat|hat|hog
3 2 cat|bat
4 1 bat|hat|dog
5 3 rat
我想对群集进行分组,以给出“标签”(用竖线分隔)出现在该群集中的比例。例如以下将是理想的结果
clusters tag prop
1 hat 1.0
1 dog 0.5
1 cat 0.5
1 bat 0.5
2 cat 1.0
2 bat 1.0
... (cluster 3 results not shown)
我当时正在考虑做类似strsplit
和table
的事情,但不知道使用dplyr是否有更简单的方法。
答案 0 :(得分:3)
这是使用tidyverse
的解决方案,说明了一些使用不同组计数来获得所需结果的方法。 add_count
告诉我们每个群集中有多少行,separate_rows
将每一行分为三部分,因此每个标记都有自己的行;那么我们可以同时group_by
和cluster
tag
,并使用n()
来告诉我们每个簇中每个标签有多少,然后除以每个簇的总标签,得出得到一定的比例。我们必须使用first
,因为这是在summarise
调用内,否则我们将制作一个过长的向量。
df <- structure(list(clusters = c(1L, 3L, 2L, 1L, 3L), tag = structure(c(3L, 4L, 2L, 1L, 5L), .Label = c("bat|hat|dog", "cat|bat|dog", "cat|hat|dog", "cat|hat|hog", "rat|mat|hog"), class = "factor")), class = "data.frame", row.names = c(NA, -5L))
library(tidyverse)
df %>%
add_count(clusters) %>%
separate_rows(tag, sep = "\\|") %>%
group_by(clusters, tag) %>%
summarise(prop = first(n()) / first(n))
#> # A tibble: 12 x 3
#> # Groups: clusters [?]
#> clusters tag prop
#> <int> <chr> <dbl>
#> 1 1 bat 0.5
#> 2 1 cat 0.5
#> 3 1 dog 1
#> 4 1 hat 1
#> 5 2 bat 1
#> 6 2 cat 1
#> 7 2 dog 1
#> 8 3 cat 0.5
#> 9 3 hat 0.5
#> 10 3 hog 1
#> 11 3 mat 0.5
#> 12 3 rat 0.5
由reprex package(v0.2.0)于2018-06-20创建。