首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算两列之间的重叠百分比

计算两列之间的重叠百分比
EN

Stack Overflow用户
提问于 2016-08-27 05:10:39
回答 1查看 1K关注 0票数 1

我有两个变数。一个连续的(范围从-2到2)和一个二分(A和B)。这两个变量与大多数编码为"B“的变量是正的,而大多数的变量被编码为"A”为负值,两者高度相关。我想在r中计算这两个变量之间的重叠比例,或者我想找出在连续尺度上最负面的观测,在二分尺度上编码为"B“的观测和在二分尺度上编码为"A”的连续尺度上最积极的观测之间有多少个观测值。

在r中处理这个问题的最好方法是什么?

例如,如果我有以下数据:

代码语言:javascript
复制
Continous Variable   Dichotmous Variable
 .189                   B
-.7                     A
 .5                     B
-.3                     A
-.5                     A
-.1                     B
 .2                     A
-.05                    A

因为具有最低值-.1的B变量和值最高的A变量是.2,所以我想计算这两个值之间的观察数。在这种情况下,它将是25%,因为我有两个观察重叠的总共8个观察。

运行循环是最好的方法吗?

如果这一点没有得到明确的解释,我会事先表示歉意,并感谢你可能提出的任何建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-27 05:38:08

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

让我们一次把它分解一段:

代码语言:javascript
复制
min(df$cont[df$dich=='B'])
## [1] -0.1

得到B组的最小连续值。

代码语言:javascript
复制
max(df$cont[df$dich=='A'])
## [1] 0.2

得到A组的最大连续值。

代码语言:javascript
复制
c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A']))
## [1] -0.1  0.2

将这两个值组合成一个双元素向量。

请注意,我没有在我的解决方案中包含任何检查这两个元素向量是否确实按升序排序的规定。在您的问题中,这似乎是一个假设,即最小B值将小于最大A值;这个假设实际上嵌入到我的解决方案中。如果您需要检查它,则必须先预先计算这两个值并检查它们的顺序。如果违背了假设,您将不得不避免运行解决方案的其余部分,因为findInterval()将在无效的vec上失败(因为没有对其进行升序排序)。

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

找出哪些元素低于最小B,(1)在最小B和最大A之间,(2)在最大A之上,我们正在寻找1s。

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

代码语言:javascript
复制
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值匹配。我们将在下一步减去不想要的比赛。

如果需要对端点进行不同的处理,可以尝试使用rightmost.closedall.insidefindInterval()left.open参数来获取所需的内容。

代码语言:javascript
复制
sum(findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))==1L)-1L
## [1] 2

减去1,以删除最小的B值,因为我们想要排除它。

代码语言:javascript
复制
(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中的行总数,得到一个分数。

代码语言:javascript
复制
(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得到一个百分比。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39177685

复制
相关文章

相似问题

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