首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有条件的元素的计数组合

具有条件的元素的计数组合
EN

Stack Overflow用户
提问于 2019-03-27 19:28:14
回答 1查看 134关注 0票数 0

我的问题与这个r count combinations of elements in groups相似,首先,我想在列中按组对所有潜在组合进行分组,第二,根据年份在n列中计算组合的出现情况。

使用相同的模拟数据集:

代码语言:javascript
复制
> 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

预期结果:

代码语言:javascript
复制
   > 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找到一个可能的解决方案。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-29 13:10:39

这里有一个解决方案,首先以data.table的形式出现,然后以dplyr的形式出现。这个过程是一样的:我们在组上自动连接,过滤id组合的顺序是一致的(任何顺序都可以工作,我们选择first id < second id),逐组对行进行编号,并删除未使用的列。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55385088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档