R:通过字符串/列表对列中的比例进行分组和计数

时间:2018-06-20 19:57:30

标签: r group-by dplyr

(编辑:数据标签并不总是三的倍数) 考虑如下数据:

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)

我当时正在考虑做类似strsplittable的事情,但不知道使用dplyr是否有更简单的方法。

1 个答案:

答案 0 :(得分:3)

这是使用tidyverse的解决方案,说明了一些使用不同组计数来获得所需结果的方法。 add_count告诉我们每个群集中有多少行,separate_rows将每一行分为三部分,因此每个标记都有自己的行;那么我们可以同时group_bycluster 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创建。