R Data.Table按表B中的表A筛选

时间:2019-03-06 18:40:22

标签: r data.table

此代码的目标是在给定的圆方程上找到给定点的象限。 我有两个单独的data.table。在表A中,我有不同的圆方程变量。在表B中,我有原始数据用于查找每个圆象限上有多少个点。我有以下顺序:

  1. 从表A中获取圆方程
  2. 从表B的坐标中滤除圆所在的点
  3. 找到它们在圆上的每个点(getQuadrant函数)
  4. 计算每个象限上有多少个点(象限函数)

我做了一些尝试,但是返回结果有点慢。表格如下:

set.seed(4)
TableA <- data.table(speed=rep(42:44,each=3), 
                     minX = rep(c(1:12),3), 
                     maxX = rep(c(10:21),3), 
                     minY = 1,
                     maxY = 10, 
                     r = 5, 
                     cX = rep(c(6:17),3), 
                     cY = 6, 
                     indx = 1:36)
TableA
   speed minX maxX minY maxY r cX cY indx
1:    42    1   10    1   10 1  2  2    1
2:    42    2   11    1   10 1  2  2    2
3:    42    3   12    1   10 1  2  2    3
4:    43    1   10    1   10 1  2  2    4
5:    43    2   11    1   10 1  2  2    5
6:    43    3   12    1   10 1  2  2    6
7:    44    1   10    1   10 1  2  2    7
8:    44    2   11    1   10 1  2  2    8
9:    44    3   12    1   10 1  2  2    9
TableB <- data.table(speed=rep(42:44,each=100),
                     x = rep(sample(12),100),
                     y = rep(sample(12),100),
                     n = rep(sample(12),100))

TableB
   speed  x  y  n
1:    42  8  2  8
2:    42  1 11 10
3:    42  3  5  5
4:    42 10 10 12
5:    42  7  8 11

查找象限的功能:

getQuadrant <- function(X=0,Y=0,R=1,PX=10,PY=10){
  #' X and Y are center of the circle
  #' R = Radius
  #' PX  and PY are a point anywhere

  # The point is on the center 
  if (PX == X & PY == Y) 
    return(0) 
  val = ((PX - X)^2 + (PY - Y)^2)
  # Outside the circle 
  if (val > R^2) 
    return(5) 
  # 1st quadrant 
  if (PX > X & PY >= Y)
    return(1) 
  # 2nd quadrant 
  if (PX <= X & PY > Y)
    return(2)
  # 3rd quadrant 
  if (PX < X & PY <= Y) 
    return(3) 
  # 4th quadrant 
  if (PX >= X & PY < Y)
    return(4) 
}

用于返回象限中点数的函数。

Quadrants <- function(dt,radius,centerX,centerY){
  #' dt is filtered data for the circle
  #' radius of the circle equation
  #' centerX and centerY are the center point of the circle equation

  if(nrow(dt) > 0 ){
    dt[,quadrant:=factor(mapply(function(X,Y,R,PX,PY) getQuadrant(X=X,Y=Y,R=R,PX=PX,PY=PY),centerX,centerY,radius,x_cut,y_cut), levels = c("1","2","3","4","5"))]
    dt <- dt[,  .(.N), keyby = .(quadrant)]
    setkeyv(dt, c("quadrant"))
    dt <- dt[CJ(levels(dt[,quadrant])),]
    dd <- list(Q1=dt$N[1],Q2=dt$N[2],Q3=dt$N[3],Q4=dt$N[4],Q5=dt$N[5])
  }else{
    dd <- list(Q1=NA,Q2=NA,Q3=NA,Q4=NA,Q5=NA) }
  return(dd)
}

我有以下解决方案,但它不起作用。

finalTable <- TableA[,c('Q1','Q2','Q3','Q4','Q5') := mapply(function(a,b,c,d,e,f,g,h) Quadrants(TableB[, .SD[x %between% c(a,b) & y %between% c(c,d) & speed == h]], radius=e, centerX = f, centerY = g),minX,maxX,minY,maxY,r,cX,cY,speed)]

我不认为我做得对。因为下面的结果不是预期的结果。

    speed minX maxX minY maxY r cX cY indx Q1 Q2  Q3 Q4 Q5
 1:    42    1   10    1   10 5  6  6    1 32 32 100 68 68
 2:    42    2   11    1   10 5  7  6    2 32 32 100 68 68
 3:    42    3   12    1   10 5  8  6    3 32 32 100 68 68
 4:    43    4   13    1   10 5  9  6    4 32 32 100 68 68
 ...
11:    42   11   20    1   10 5 16  6   11 32 32 100 68 68
12:    42   12   21    1   10 5 17  6   12 32 32 100 68 68
13:    43    1   10    1   10 5  6  6   13 32 32 100 68 68
14:    43    2   11    1   10 5  7  6   14 32 32 100 68 68
15:    43    3   12    1   10 5  8  6   15 32 32 100 68 68
...
22:    43   10   19    1   10 5 15  6   22 32 32 100 68 68
23:    43   11   20    1   10 5 16  6   23 32 32 100 68 68
24:    43   12   21    1   10 5 17  6   24 32 32 100 68 68
25:    44    1   10    1   10 5  6  6   25 32 32 100 68 68
26:    44    2   11    1   10 5  7  6   26 32 32 100 68 68
27:    44    3   12    1   10 5  8  6   27 32 32 100 68 68
28:    42    4   13    1   10 5  9  6   28 32 32 100 68 68
...
35:    44   11   20    1   10 5 16  6   35 32 32 100 68 68
36:    44   12   21    1   10 5 17  6   36 32 32 100 68 68

任何人都可以看看。我真的很感激。

预期输出:

    speed minX maxX minY maxY r cX cY indx  Q1  Q2  Q3  Q4  Q5
 1:    42    2   11    1   10 5  7  6    1 200 100 400 100 200
 2:    42    3   12    1   10 5  8  6    2 200 100 300 100 200
 3:    42    4   13    1   10 5  9  6    3 200 100 300 100 100
 4:    42    5   14    1   10 5 10  6    4 100 200 300  NA 100
...
11:    42   12   21    1   10 5 17  6   11  NA  NA  NA  NA  NA
12:    42   13   22    1   10 5 18  6   12  NA  NA  NA  NA  NA
13:    43    2   11    1   10 5  7  6   13 200 100 400 100 200
14:    43    3   12    1   10 5  8  6   14 200 100 300 100 200
15:    43    4   13    1   10 5  9  6   15 200 100 300 100 100
...
22:    43   11   20    1   10 5 16  6   22  NA  NA  NA  NA 100
23:    43   12   21    1   10 5 17  6   23  NA  NA  NA  NA  NA
24:    43   13   22    1   10 5 18  6   24  NA  NA  NA  NA  NA
25:    44    2   11    1   10 5  7  6   25 200 100 400 100 200
26:    44    3   12    1   10 5  8  6   26 200 100 300 100 200
27:    44    4   13    1   10 5  9  6   27 200 100 300 100 100
28:    44    5   14    1   10 5 10  6   28 100 200 300  NA 100
...
35:    44   12   21    1   10 5 17  6   35  NA  NA  NA  NA  NA
36:    44   13   22    1   10 5 18  6   36  NA  NA  NA  NA  NA

0 个答案:

没有答案