df <- data.frame(cont=c(0.189,-0.7,0.5,-0.3,-0.5,-0.1,0.2,-0.05),dich=c('B','A','B','A','A','B','A','A'));
(sum(findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))==1L)-1L)/nrow(df)*100;
## [1] 25
让我们一次一个地分解:
min(df$cont[df$dich=='B'])
## [1] -0.1
获取B组的最小连续值。
max(df$cont[df$dich=='A'])
## [1] 0.2
获取A组的最大连续值。
c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A']))
## [1] -0.1 0.2
将这两个值组合成一个二元素向量。
请注意,我的解决方案中没有包含任何用于检查此二元素向量是否确实按升序排序的规定。您的问题似乎是一个假设,即最小的 B 值将小于最大的 A 值;该假设有效地嵌入到我的解决方案中。如果您需要检查它,您必须先预先计算这两个值并检查它们的顺序。如果违反假设,您将不得不避免运行解决方案的其余部分,因为findInterval() 将在无效的(由于未按升序排序)vec 上失败。
findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))
## [1] 1 0 2 0 0 1 2 1
找出哪些元素在 (0) 最小 B 之下,(1) 在最小 B 和最大 A 之间,以及 (2) 在最大 A 之上。我们正在寻找 1。
findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))==1L
## [1] TRUE FALSE FALSE FALSE FALSE TRUE FALSE TRUE
测试哪些区间是 1。
sum(findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))==1L)
## [1] 3
计算为 1 的区间数。
请注意,我们得到的是 3 而不是 2,因为findInterval() 默认包含区间的下限,因此最小的 B 值匹配。我们将在下一步中减去不需要的匹配项。
如果您需要对端点进行不同的处理,您可以尝试使用findInterval() 的rightmost.closed、all.inside 和left.open 参数来获得您需要的东西。
sum(findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))==1L)-1L
## [1] 2
减去 1 以去除最小的 B 值,因为我们要排除它。
(sum(findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))==1L)-1L)/nrow(df)
## [1] 0.25
除以 data.frame 中的总行数得到分数。
(sum(findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))==1L)-1L)/nrow(df)*100;
## [1] 25
乘以 100 得到百分比。