我有两个变数。一个连续的(范围从-2到2)和一个二分(A和B)。这两个变量与大多数编码为"B“的变量是正的,而大多数的变量被编码为"A”为负值,两者高度相关。我想在r中计算这两个变量之间的重叠比例,或者我想找出在连续尺度上最负面的观测,在二分尺度上编码为"B“的观测和在二分尺度上编码为"A”的连续尺度上最积极的观测之间有多少个观测值。
在r中处理这个问题的最好方法是什么?
例如,如果我有以下数据:
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个观察。
运行循环是最好的方法吗?
如果这一点没有得到明确的解释,我会事先表示歉意,并感谢你可能提出的任何建议。
发布于 2016-08-27 05:38:08
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找出哪些元素低于最小B,(1)在最小B和最大A之间,(2)在最大A之上,我们正在寻找1s。
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值匹配。我们将在下一步减去不想要的比赛。
如果需要对端点进行不同的处理,可以尝试使用rightmost.closed、all.inside和findInterval()的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得到一个百分比。
https://stackoverflow.com/questions/39177685
复制相似问题