加快代码速度,使公司处在半径范围内,并将其汇总为R

时间:2019-06-21 12:26:32

标签: r datatable coordinates

我有两个数据表。

一种是房屋位置为d8.small(东座标,北座标,街道名称和身份证号),另一种为在一个半角内的公司数为STATENT(东座标,北座标和公司编号)。

d8.small[1:5, .(GKODE,GKODN,strasse, id)]
     GKODE   GKODN           strasse       id
1: 2608850 1262583      hauptstrasse      100
2: 2612952 1267232 ramsteinerstrasse 10000012
3: 2612952 1267232 ramsteinerstrasse 11776807
4: 2623360 1247413  mosermattstrasse 10000061
5: 2622938 1259411      im pfauenhof 10000223
STATENT[1:5, .(E_KOORD,N_KOORD,`Arbeitsstätten Total`)]
   E_KOORD N_KOORD Arbeitsstätten Total
1: 2486200 1111300                    3
2: 2486200 1111500                    3
3: 2486300 1111000                    3
4: 2486300 1111700                    3
5: 2486400 1111600                    3

我需要在第一个数据表中添加一个新列,其中包含2000米以内的公司数量。

我当前的方法似乎有效,但是速度很慢:如何加快速度?

d8.small[,
         c("idex_vollzeitstellen") := {
            dist = (GKODE - STATENT[["E_KOORD"]])^2 + (GKODN - STATENT[["N_KOORD"]])^2 
            .(sum(STATENT$`Arbeitsstätten Total`[sqrt(dist < 25000000)]))},by = id]

1 个答案:

答案 0 :(得分:0)

d8.small = fread('GKODE   GKODN           strasse       id
 2608850 1262583      hauptstrasse      100
 2612952 1267232 ramsteinerstrasse 10000012
 2612952 1267232 ramsteinerstrasse 11776807
 2623360 1247413  mosermattstrasse 10000061
 2622938 1259411      impfauenhof 10000223', header=TRUE)

STATENT = fread('   E_KOORD N_KOORD Arbeitsstätten Total
2486200 1111300         NA           3
 2486200 1111500        NA            3
 2486300 1111000        NA            3
 2486300 1111700        NA            3
 2486400 1111600        NA            3', header=TRUE)

d8.small[, check := 1]
STATENT[, check := 1]
d8.small = merge(d8.small, STATENT, by='check', how='left', allow.cartesian = T)
d8.small[, dist := ifelse((GKODE - E_KOORD)^2 + (GKODN - N_KOORD)^2 < 2000^2, 1, 0)]
d8.small[, sum(dist), id]