Как «сгруппировать» ряд перекрывающихся координат точек - PullRequest
0 голосов
/ 02 июля 2019

У меня довольно большой (250k ряд) набор данных, который имеет много перекрывающихся координат точек. Мне нужно отобразить эти координаты, но я могу использовать только одну точку для каждого действительного объекта.

По сути, мне нужно найти способ объединить все дифференцирующие данные (исходный код, код формы, WasteW) в каждое отдельное средство.

Вот что мой набор данных выглядит сырым raw data

Вот как бы я хотел, чтобы это выглядело what i want it to look like

Я могу использовать SQL (через базу данных ORACLE) для извлечения необработанных данных, или R или ArcGIS / Qgis для объединения после факта.

Я выполнял оператор group by в SQL при извлечении кода, но он смог предоставить только необработанные данные, показанные ниже.

select distinct 
REPORTING.TONS, 
REPORTING.YEAR, 
REPORTING.NAME, 
REPORTING.ID,
REPORTING.source_code,
REPORTING.form_code,
REPORTING.primary_naics,
REPORTING.WASTEW
REPORTING.LAT
REPORTING.LON

from REPORTING where 1=1 and 
upper(REPORTING.REPORT_CYCLE) = 2017 
order by 
REPORTING.TONS, 
REPORTING.YEAR, 
REPORTING.NAME, 
REPORTING.ID,
REPORTING.source_code,
REPORTING.form_code,
REPORTING.primary_naics,
REPORTING.WASTEW
REPORTING.LAT
REPORTING.LON

ОБНОВЛЕННЫЙ РЕЗУЛЬТАТ С НОВЫМ КОДОМ ОТ ПАРФАЙТА enter image description here

RAW DATA:

| Tons | Year | Name     | ID           | SOURCE_CODE | FORM_CODE | primary_naics  | WASTEW | Lat       | Lon       |
| 0    | 2017 | Airborne | TN5210020140 | G11         | W801      | 928110 | N          | 36.611123 | -87.46234 |
| 0    | 2017 | Airborne | TN5210020140 | G13         | W101      | 928110 | Y          | 36.611123 | -87.46234 |
| 0    | 2017 | Airborne | TN5210020140 | G14         | W200      | 928110 | N          | 36.611123 | -87.46234 |
| 0    | 2017 | Airborne | TN5210020140 | G14         | W101      | 928110 | N          | 36.611123 | -87.46234 |
| 0    | 2017 | Airborne | TN5210020140 | G32         | W310      | 928110 | N          | 36.611123 | -87.46234 |
| 0    | 2017 | Century  | NVD980895338 | G01         | W001      | 562211 | N          | 39.61028  | -119.2031 |
| 0    | 2017 | Century  | NVD980895338 | G02         | W001      | 562211 | Y          | 39.61028  | -119.2031 |
| 0    | 2017 | Century  | NVD980895338 | G03         | W002      | 562211 | N          | 39.61028  | -119.2031 |
| 0    | 2017 | Century  | NVD980895338 | G03         | W004      | 562211 | N          | 39.61028  | -119.2031 |
| 0    | 2017 | Century  | NVD980895338 | G04         | W004      | 562211 | Y          | 39.61028  | -119.2031 |

НОВЫЕ ДАННЫЕ ИЗ SQL PULL:

    +--------+------+-------------------------------------------------------+--------------+-------------+----------------+--------+-------+
| 6.874  | 2017 | FLINT HILLS RESOURCES ALASKA, LLC NORTH POLE TERMINAL | AKD000850701 |     G23     |      W609      | 424710 |   N   |
+--------+------+-------------------------------------------------------+--------------+-------------+----------------+--------+-------+
| 7.2015 | 2017 | FLINT HILLS RESOURCES ALASKA, LLC NORTH POLE TERMINAL | AKD000850701 | G19         | W609           | 424710 | N     |
| 10.333 | 2017 | FLINT HILLS RESOURCES ALASKA, LLC NORTH POLE TERMINAL | AKD000850701 | G19         | W319           | 424710 | N     |
| 0.05   | 2017 | SWANSON RIVER OIL PIPELINE                            | AKD035419795 | G19         | W310           | 486110 | N     |
| 3.242  | 2017 | SWANSON RIVER OIL PIPELINE                            | AKD035419795 | G07         | W002           | 486110 | N     |
| 0.0005 | 2017 | UNIVERSITY OF ALASKA FAIRBANKS                        | AKD048679567 | G11,G11,G11 | W001,W004,W801 |  61131 | N,N,N |
| 0.001  | 2017 | UNIVERSITY OF ALASKA FAIRBANKS                        | AKD048679567 | G11,G11,G11 | W001,W004,W801 |  61131 | N,N,N |
| 0.0015 | 2017 | UNIVERSITY OF ALASKA FAIRBANKS                        | AKD048679567 | G11,G11     | W001,W801      |  61131 | N,N   |
| 0.0025 | 2017 | UNIVERSITY OF ALASKA FAIRBANKS                        | AKD048679567 | G11         | W001           |  61131 | N     |
| 0.005  | 2017 | UNIVERSITY OF ALASKA FAIRBANKS                        | AKD048679567 | G11,G11     | W001,W801      |  61131 | N,N   |
| 0.006  | 2017 | UNIVERSITY OF ALASKA FAIRBANKS                        | AKD048679567 | G22         | W001           |  61131 | N     |
| 0.0095 | 2017 | UNIVERSITY OF ALASKA FAIRBANKS                        | AKD048679567 | G11         | W001           |  61131 | N     |
| 0.01   | 2017 | UNIVERSITY OF ALASKA FAIRBANKS                        | AKD048679567 | G11         | W001           |  61131 | N     |
| 0.015  | 2017 | UNIVERSITY OF ALASKA FAIRBANKS                        | AKD048679567 | G11         | W001           |  61131 | N     |
| 0.025  | 2017 | UNIVERSITY OF ALASKA FAIRBANKS                        | AKD048679567 | G09,G11,G15 | W001,W001,W002 |  61131 | N,N,N |
| 0.03   | 2017 | UNIVERSITY OF ALASKA FAIRBANKS                        | AKD048679567 | G11         | W001           |  61131 | N     |
+--------+------+-------------------------------------------------------+--------------+-------------+----------------+--------+-------+

Ответы [ 3 ]

0 голосов
/ 02 июля 2019

Рассмотрим фактический агрегатный запрос с GROUP BY, особенно с использованием Oracle LISTAGG для значений через запятую в source_code и form_code .Выполните весь оператор ниже в вызове запроса R:

WITH wst_list AS (
    SELECT  Tons, "Year", "Name", "ID", primary_naics,
            LISTAGG(WASTEW, ', ') WITHIN GROUP (ORDER BY "ID") AS WASTEW,
            Lat, Lon
    FROM (SELECT DISTINCT Tons, "Year", "Name", "ID", WASTEW, primary_naics, Lat, Lon
          FROM "REPORTING")
    GROUP BY Tons, "Year", "Name", "ID", primary_naics, Lat, Lon
),
 src_list AS (
    SELECT  Tons, "Year", "Name", "ID", primary_naics,
            LISTAGG(SOURCE_CODE, ', ') WITHIN GROUP (ORDER BY "ID") AS SOURCE_CODE,
            Lat, Lon
    FROM (SELECT DISTINCT Tons, "Year", "Name", "ID", SOURCE_CODE, primary_naics, Lat, Lon
          FROM "REPORTING")
    GROUP BY Tons, "Year", "Name", "ID", primary_naics, Lat, Lon
),
 frm_list AS (
    SELECT  Tons, "Year", "Name", "ID", primary_naics,
            LISTAGG(FORM_CODE, ', ') WITHIN GROUP (ORDER BY "ID") AS FORM_CODE,
            Lat, Lon
    FROM (SELECT DISTINCT Tons, "Year", "Name", "ID", FORM_CODE, primary_naics, Lat, Lon
          FROM "REPORTING")
    GROUP BY Tons, "Year", "Name", "ID", primary_naics, Lat, Lon
)


SELECT *
FROM wst_list
NATURAL JOIN src_list
NATURAL JOIN frm_list

Вывод

╔═══╤══════╤══════╤══════════╤══════════════╤═══════════════╤═══════════╤═══════════╤════════╤════════════════════╤════════════════════════╗
║   │ TONS │ Year │ Name     │ ID           │ PRIMARY_NAICS │ LAT       │ LON       │ WASTEW │ SOURCE_CODE        │ FORM_CODE              ║
╠═══╪══════╪══════╪══════════╪══════════════╪═══════════════╪═══════════╪═══════════╪════════╪════════════════════╪════════════════════════╣
║ 1 │ 0    │ 2017 │ Century  │ NVD980895338 │ 562211        │ 39,61028  │ -119,2031 │ N, Y   │ G01, G02, G03, G04 │ W001, W002, W004       ║
╟───┼──────┼──────┼──────────┼──────────────┼───────────────┼───────────┼───────────┼────────┼────────────────────┼────────────────────────╢
║ 2 │ 0    │ 2017 │ Airborne │ TN5210020140 │ 928110        │ 36,611123 │ -87,46234 │ N, Y   │ G11, G13, G14, G32 │ W101, W200, W310, W801 ║
╚═══╧══════╧══════╧══════════╧══════════════╧═══════════════╧═══════════╧═══════════╧════════╧════════════════════╧════════════════════════╝

Rextester Demo

0 голосов
/ 04 июля 2019

Если вы можете использовать SQL, то следующий SQL - тот, который даст вам желаемый результат.

SELECT
    TONS,
    YEAR,
    NAME,
    ID,
    REGEXP_REPLACE(RTRIM(XMLAGG(XMLELEMENT(E, SOURCE_CODE, ',').EXTRACT('//text()')
        ORDER BY
            SOURCE_CODE
    ).GETCLOBVAL(), ','), '([^,]+)(,\1)+', '\1') AS SOURCE_CODE,
    REGEXP_REPLACE(RTRIM(XMLAGG(XMLELEMENT(E, FORM_CODE, ',').EXTRACT('//text()')
        ORDER BY
            FORM_CODE
    ).GETCLOBVAL(), ','), '([^,]+)(,\1)+', '\1') AS FORM_CODE,
    NAICS,
    REGEXP_REPLACE(RTRIM(XMLAGG(XMLELEMENT(E, WASTEW, ',').EXTRACT('//text()')
        ORDER BY
            WASTEW
    ).GETCLOBVAL(), ','), '([^,]+)(,\1)+', '\1') AS WASTEW,
    LAT,
    LON
FROM
    REPORTING
GROUP BY
    TONS,
    YEAR,
    NAME,
    ID,
    NAICS,
    LAT,
    LON;

Примечание: REGEXP_REPLACE используется для извлечения различных значений в агрегации, поскольку LISTAGG with distinct поступает в Oracle 19c .

Ура !!

0 голосов
/ 02 июля 2019

Немного неясно, как вы хотите объединить значения в некоторых из столбцов, особенно WASTEW, но здесь есть подход по принципу tidyverse, чтобы взять ваш необработанный набор данных и суммировать его:

library(dplyr)
library(readr)

"Tons Year Name ID SOURCE_CODE FORM_CODE NAICS WASTEW Lat Lon
 0 2017 101ST TN521002 G11 W801 928110 N 36.61112 -87.4623
 0 2017 101ST TN521002 G13 Wl0l 928110 Y 36.61112 -87.4623
 0 2017 101ST TN521002 G14 W200 928110 N 36.61112 -87.4623
 0 2017 101ST TN521002 G14 W603 928110 N 36.61112 -87.4623
 0 2017 101ST TN521002 G16 W103 928110 N 36.61112 -87.4623
 0 2017 101ST TN521002 G16 W310 928110 N 36.61112 -87.4623
 0 2017 101ST TN521002 G22 W113 928110 Y 36.61112 -87.4623
 0 2017 101ST TN521002 G22 W219 928110 N 36.61112 -87.4623
 0 2017 101ST TN521002 G32 W117 928110 N 36.61112 -87.4623
 0 2017 101ST TN521002 G32 W301 928110 N 36.61112 -87.4623
 0 2017 101ST TN521002 G32 W310 928110 N 36.61112 -87.4623
 0 2017 21ST NVD9808 G12 W00l 562211 N 39.61028 -119.203
 0 2017 21ST NVD9808 G98 W00l 562211 Y 39.61028 -119.203
 0 2017 21ST NVD9808 G54 W002 562211 N 39.61028 -119.203
 0 2017 21ST NVD9808 G34 W004 562211 N 39.61028 -119.203
 0 2017 21ST NVD9808 G12 W004 562211 Y 39.61028 -119.203" %>% 
  read_table2() %>% 
  group_by(Tons, Year, Name, ID, NAICS, Lat, Lon) %>% 
  summarize(SOURCE_CODE = paste(SOURCE_CODE, collapse = ", "), 
            FORM_CODE = paste(FORM_CODE, collapse = ", "), 
            WASTEW = case_when("N" %in% WASTEW & "Y" %in% WASTEW ~ "Y, N", 
                               "N" %in% WASTEW ~ "N", 
                               "Y" %in% WASTEW ~ "Y", 
                               TRUE ~ "")) %>% 
  ungroup() %>% 
  select(Tons, Year, Name, ID, SOURCE_CODE, FORM_CODE, NAICS, WASTEW, Lat, Lon)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...