使用dplyrs group_by并汇总查找具有不同向量

时间:2017-11-21 16:50:26

标签: r dplyr tidyverse

我有一种情况,我试图在另一个元组中找到每个组的矢量的交叉点数。

数据示例

a <- tibble(EXPERIMENT = rep(c("a","b","c"),each =4), 
            ECOTYPE = rep(1:12))
b <- tibble(ECOTYPE = c(1,1,5,4,8,7,6,1,4,4,2,5,6,7,1))

我想查找ECOTYPEb ECOTYPEEXPERIMENT a group_by之间的交叉点数。

我想知道我是否可以使用dplyr来解决这个问题,因为a %>% group_by(EXPERIMENT) %>% summarise(INTERSECTIONS = length(intersect(b$ECOTYPE, .$ECOTYPE)) 函数似乎适合这个问题,但是当我运行时:

a

我只获得b# A tibble: 3 x 2 EXPERIMENT INTERSECTIONS <chr> <dbl> 1 a 8 2 b 7 3 c 0之间的交叉总数。

我错过了什么吗?

修改

很抱歉没有发布我想要的输出。我想要这样的东西:

scipy.optimize.brentq(lambda x: f1(x)-f2(x), a, b)

2 个答案:

答案 0 :(得分:2)

根据您的计算方式,这将给出b匹配a的行数:

b %>% mutate(b_flag = 1) %>%
  right_join(a) %>%
  group_by(EXPERIMENT) %>% 
  summarize(INTERSECTIONS = sum(b_flag, na.rm = T))
# # A tibble: 3 x 2
#   EXPERIMENT INTERSECTIONS
#       <fctr>         <dbl>
# 1          a             8
# 2          b             7
# 3          c             0

我认为您的代码唯一的问题是不必要的.$,但它会在b中提供不同生态类型的计数,忽略b这一事实例如,有三个ECOTYPE = 1行。

a %>% 
  group_by(EXPERIMENT) %>% 
  summarise(INTERSECTIONS = length(intersect(b$ECOTYPE, ECOTYPE)))
# # A tibble: 3 x 2
#   EXPERIMENT INTERSECTIONS
#       <fctr>         <int>
# 1          a             3
# 2          b             4
# 3          c             0            

这是intersect工作原理的结果:

intersect(c(1, 2, 3), c(1, 1, 1))
# [1] 1

答案 1 :(得分:0)

加入这两个并计算剩下的数量:

inner_join(a,b, by='ECOTYPE') %>% group_by(EXPERIMENT) %>% count()
# A tibble: 2 x 2
# Groups:   EXPERIMENT [2]
  EXPERIMENT     n
       <chr> <int>
1          a     8
2          b     7

现在,如果您向b添加指标列,您也可以开始计算缺席次数:

b %>% mutate(present=TRUE) %>% right_join(a, by='ECOTYPE') %>% group_by(EXPERIMENT) %>% summarise(n(), missing=sum(is.na(present)))
# A tibble: 3 x 3
  EXPERIMENT `n()` missing
       <chr> <int>   <int>
1          a     9       1
2          b     7       0
3          c     4       4