寻找一种方法来确定 R 中某条(非线性)线上方有多少点

Looking for a way to determine how many points are above a certain (nonlinear) line in R

我有一个大数据框 (df),其中包含 x/y 坐标和位于中间某处的非线性回归线,请参见下图。许多点重叠,这就是为什么我有一个额外的列 $Freq.

我正在寻找一种方法来确定这条线上方有多少点(许多点相互重叠)。请参阅下面的 df 结构。

head(df)
    x   y  Freq
    0   0  396
    1   1  222
    1   0  513
    2   0  315
    2   1  279
    2   2   36
...

我知道 Whosebug 上的多边形方法,但我似乎无法使用这些方法,部分原因可能是我的线是一系列坐标而不是公式:

head(line)
x    y
0 0.0000
1 0.4220
2 0.8350
3 1.2545
4 1.6615
5 2.0450

最后,如果我能有三个数字就好了:一个描述了线上方点的数量,线下方点的数量,可能还有它右边的点数特定行。

谢谢!

这里有很多未知数,不过

df=merge(df,line,by="x",suffixes=c("_df","_line"))
sum(df$Freq[df$y_df>df$y_line])

[1] 537
library(tidyverse)

data <- tibble::tribble(
  ~x, ~y, ~Freq,
  0,   0,  396,
  1,   1,  222,
  1,   0,  513,
  2,   0,  315,
  2,   1,  279,
  2,   2,   36
  )
data
#> # A tibble: 6 x 3
#>       x     y  Freq
#>   <dbl> <dbl> <dbl>
#> 1     0     0   396
#> 2     1     1   222
#> 3     1     0   513
#> 4     2     0   315
#> 5     2     1   279
#> 6     2     2    36

line <- tibble::tribble(
  ~x, ~y,
  0, 0.0000,
  1, 0.4220,
  2, 0.8350,
  3, 1.2545,
  4, 1.6615,
  5, 2.0450
  )
line
#> # A tibble: 6 x 2
#>       x     y
#>   <dbl> <dbl>
#> 1     0 0    
#> 2     1 0.422
#> 3     2 0.835
#> 4     3 1.25 
#> 5     4 1.66 
#> 6     5 2.04

data %>%
  left_join(line %>% rename(line_y = y)) %>%
  filter(y > line_y)
#> Joining, by = "x"
#> # A tibble: 3 x 4
#>       x     y  Freq line_y
#>   <dbl> <dbl> <dbl>  <dbl>
#> 1     1     1   222  0.422
#> 2     2     1   279  0.835
#> 3     2     2    36  0.835

data %>%
  left_join(line %>% rename(line_y = y)) %>%
  filter(y > line_y) %>%
  summarise(sum(Freq))
#> Joining, by = "x"
#> # A tibble: 1 x 1
#>   `sum(Freq)`
#>         <dbl>
#> 1         537

data %>%
  left_join(line %>% rename(line_y = y)) %>%
  filter(y > line_y) %>%
  nrow()
#> Joining, by = "x"
#> [1] 3

reprex package (v2.0.1)

于 2021-11-09 创建