【问题标题】:R: group by and count proportions in column with strings/listsR:按字符串/列表分组并计算列中的比例
【发布时间】:2018-06-20 19:57:30
【问题描述】:

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

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.167,而帽子和狗为 0.333。相反,您有 1.0 和 0.5。你只想乘以 3 吗?
  • 集群 1 中的两次观察。cat 一次在集群 1 中的频率为 1/2。 dog 有两次,所以 2/2 =1.0
  • 我现在没有得到相同的示例 data.frame。
  • @ngm 刚刚修复

标签: r group-by dplyr


【解决方案1】:

这是使用tidyverse 的解决方案,说明了您可以使用不同的组数来获得所需结果的一些方法。 add_count 告诉我们每个集群有多少行,separate_rows 将每行拆分为三个,因此每个标签都有自己的行;然后我们可以group_byclustertag 并使用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 年 6 月 20 日创建。

【讨论】:

  • 仅供参考,标签可能具有不同的长度,例如"cat" 可能在一行,而 "hat|dog|chicken" 在另一行。
  • 好的,已修复以解决该问题,但您还应该更新示例数据和所需的输出以反映这种情况。
猜你喜欢
  • 2022-01-21
  • 2011-04-27
  • 2021-09-17
  • 1970-01-01
  • 2015-01-02
  • 2022-11-27
  • 2018-05-12
  • 1970-01-01
  • 2018-09-25
相关资源
最近更新 更多