buildings
320 万行のテーブルがあります。(バランスの取れた) Paneldataとして処理するには、このテーブルを 11 の異なる期間に拡張する必要があります。これは、すべてのオブジェクトについて、11 の異なる年 (2000 年から 2010 年) を観察する必要があることを意味します。ピリオドは次のように呼ばれる必要があります。
2000
2001
...
2009
2010
テーブル定義
CREATE TABLE public.buildings
(
gid integer NOT NULL DEFAULT nextval('buildings_gid_seq'::regclass),
osm_id character varying(11),
name character varying(48),
type character varying(16),
geom geometry(MultiPolygon,4326),
centroid geometry(Point,4326),
gembez character varying(50),
gemname character varying(50),
krsbez character varying(50),
krsname character varying(50),
pv boolean,
gr smallint,
capac double precision,
instdate date,
pvid integer,
dist double precision,
gemewz integer,
n500 integer,
ibase double precision,
popden integer,
instp smallint,
b2000 double precision,
b2001 double precision,
b2002 double precision,
b2003 double precision,
b2004 double precision,
b2005 double precision,
b2006 double precision,
b2007 double precision,
b2008 double precision,
b2009 double precision,
b2010 double precision,
ibase_id integer[],
ibase_dist integer[],
CONSTRAINT buildings_pkey PRIMARY KEY (gid)
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.buildings
OWNER TO postgres;
CREATE INDEX build_centroid_gix
ON public.buildings
USING gist
(st_transform(centroid, 31467));
CREATE INDEX buildings_geom_idx
ON public.buildings
USING gist
(geom);
Rでの回帰分析にデータを使用したい。
ibase_id
の配列ですgid
。
ibase_dist
オブジェクトまでの距離を含む関連配列gid
です。2 つの配列の長さは常に同じです。
gid
配列内の は のレコードに属し、オブジェクトの中心buildings
から 500m の半径内にありcentroid
、かつ pv=TRUE です (これはdist
、instdate
、instp
、capac
&pvid
がであることを意味しますNOT NULL
)。
SELECT a.gid AS buildid, array_agg(b.gid) AS ibase_id, array_agg(round(ST_Distance(ST_Transform(a.centroid, 31467), ST_Transform(b.centroid, 31467))::integer)) AS ibase_dist
FROM buildings a
LEFT JOIN (SELECT * FROM buildings WHERE pv=TRUE) AS b ON ST_DWithin(ST_Transform(a.centroid, 31467), ST_Transform(b.centroid, 31467), 500.0)
AND a.gid <> b.gid
GROUP BY a.gid
例:
ibase_id: {3075528,409073,322311,226643,833798,322344,226609}
;
ibase_dist {290,293,398,494,411,381,384}
UPDATE buildings
SET ibase=SUM(1/s)
FROM unnest(SELECT ibasedist FROM buildings WHERE (SELECT instp
FROM buildings
WHERE gid IN unnest(ibase_id))<year) s
各期間について、配列のエントリのみが考慮され、その年はパネル データの観測期間よりも前でした。(最初に配列を連結する必要があるため、上記のクエリはまだ機能しません)現在、2 つの配列はすべての年の情報を保持しています。そのため、各期間に追加する必要があると考えたので、パネルデータに展開した後、ibase
各レコード (11x 3,2 百万) を計算します。
回帰分析にすべての列は必要ありません。乗算のパフォーマンスが劇的に向上する場合は、行に固執することができます (基本的にはジオメトリ列を除外します)。
gid integer NOT NULL DEFAULT nextval('buildings_gid_seq'::regclass),
gembez character varying(50),
gemname character varying(50),
krsbez character varying(50),
krsname character varying(50),
pv boolean,
gr smallint,
capac double precision,
dist double precision,
gemewz integer,
n500 integer,
ibase double precision,
popden integer,
instp smallint,
b2000 double precision,
b2001 double precision,
b2002 double precision,
b2003 double precision,
b2004 double precision,
b2005 double precision,
b2006 double precision,
b2007 double precision,
b2008 double precision,
b2009 double precision,
b2010 double precision,
ibase_id integer[],
ibase_dist integer[],
CONSTRAINT buildings_pkey PRIMARY KEY (gid)
)
WITH (
OIDS=FALSE
ソリューションアプローチ
periods
11 の異なる期間を含む 2 番目のテーブルを作成し、このテーブルに table を乗算するという基本的なアイデアがありましたbuildings
。これを実装する方法がわからない。残念ながら、私は R の経験があまりなく、R のデータベース インターフェイスをまだ使用していません。
Visual C++ ビルド 1800、64 ビットおよび R x64 3.2.1 でコンパイルされた PostgreSQL 9.5beta2 での作業