【问题标题】:Count combinations of elements with condition计算有条件的元素组合
【发布时间】:2019-03-27 19:28:14
【问题描述】:

我的问题与r count combinations of elements in groups 类似,但是,首先,我想在 Comb 列中按组对所有潜在组合进行分组,其次,根据年份计算组合的出现次数n 列。

使用相同的模拟数据集:

> dat = data.table(group = c(1,1,1,2,2,2,3,3), id=c(10,11,12,10,11,13,11,13))
> dat
   group id year
1:     1 10 2010
2:     1 11 2010
3:     1 12 2010 
4:     2 10 2011 
5:     2 11 2011 
6:     2 13 2011
7:     3 11 2012
8:     3 13 2012

期望的结果:

   > dat
           group Comb   year  n
        1:     1 10 11  2010  1
        2:     1 11 12  2010  1
        3:     1 12 10  2010  1
        4:     2 10 11  2011  2
        5:     2 11 13  2011  1
        6:     2 13 10  2011  1
        7:     3 11 13  2012  2

我非常感谢 dplyr 的可能解决方案。

谢谢

【问题讨论】:

  • 我不理解您输出中的 n 列。也不是你的组合。在您的输出中,第 4 行具有组合 10 11,第 5 行具有组合 11 10。为什么顺序在这里很重要,但以前不重要?为什么第 2 组有 11 10,但第 1 组没有?为什么那些n 值是2
  • 如果您正在寻找 dplyr 解决方案,请问您为什么使用 data.table 而不是 tibble?也许根据您的要求添加正确的标签会很有用
  • 我已经根据@Gregor 评论更改了预期的结果。顺序无关紧要,重要的是为每个 group 获取所有可能的 id 组合。然后,根据 n yeargroup 对事件进行编号。我希望这会有所帮助。
  • 我还是不明白n。如果我们查看您的输入,在 @​​987654331@ 和 group = 1 中,有 3 个 ID,都是唯一的,101112group = 1, year = 2010 的期望结果有 3 行,每个 Comb 一行,n 是所有行。这对我来说很有意义。但是,group = 2year = 2011 的输入看起来相同:3 行,3 个唯一 ID。但在输出中,Combs = 10 11n = 2。为什么n = 2在输出第4行,而n = 1在输出第1行???
  • 因为是10 11组合的第二次出现。在row 7 梳子11 13 n=2 中相似,因为row5 中出现了相同的组合。

标签: r dplyr data.table


【解决方案1】:

这是一个解决方案,首先显示为 data.table,然后显示为 dplyr。过程是相同的:我们在组中自加入,过滤 id 组合的顺序一致的位置(任何顺序都可以,我们选择first id < second id),按组合对行进行编号,并删除未使用的列。

dat = data.table(group = c(1,1,1,2,2,2,3,3), id=c(10,11,12,10,11,13,11,13))

## with data.table
merge(dat, dat, by = "group", allow.cartesian = TRUE)[
  id.x < id.y, ][
    , Comb := paste(id.x, id.y)][
      , n := 1:.N, by = .(Comb)
    ][, .(group, Comb, n)]
#    group  Comb n
# 1:     1 10 11 1
# 2:     1 10 12 1
# 3:     1 11 12 1
# 4:     2 10 11 2
# 5:     2 10 13 1
# 6:     2 11 13 1
# 7:     3 11 13 2

## with dplyr
dat %>% full_join(dat, by = "group") %>%
  filter(id.x < id.y) %>%
  group_by(Comb = paste(id.x, id.y)) %>%
  mutate(n = row_number()) %>%
  select(group, Comb, n)
# # A tibble: 7 x 3
# # Groups:   Comb [5]
#   group Comb      n
#   <dbl> <chr> <int>
# 1     1 10 11     1
# 2     1 10 12     1
# 3     1 11 12     1
# 4     2 10 11     2
# 5     2 10 13     1
# 6     2 11 13     1
# 7     3 11 13     2

【讨论】:

    猜你喜欢
    • 2019-02-09
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多