【问题标题】:Calculating Percent Overlap from Between two Columns计算两列之间的重叠百分比
【发布时间】:2016-08-27 13:56:09
【问题描述】:

我有两个变量。一个连续(范围从 -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

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

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

如果没有明确解释,我提前道歉,感谢您提供的任何建议。

【问题讨论】:

    标签: r loops


    【解决方案1】:
    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 得到百分比。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 2021-12-11
      • 1970-01-01
      相关资源
      最近更新 更多