我有一种情况,我试图在另一个元组中找到每个组的矢量的交叉点数。
数据示例
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))
我想查找ECOTYPE
中b
ECOTYPE
与EXPERIMENT
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)
答案 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