2015-09-16 8 views
0

Я пытаюсь рассчитать сгруппированные средние значения на основе пространственной агрегации .Пространственное агрегирование с группой по

У меня есть два файла формы: переписные участки и подопечные. Подопечные имеют значение , что я хотел бы усреднить по коэффициенту для каждого участка переписи.

Вот shapfiles:

library(dplyr) 
library(rgeos) 
library(rgdal) 
# Census tracts 
download.file("http://www12.statcan.gc.ca/census-recensement/2011/geo/bound-limit/files-fichiers/gct_000b11a_e.zip", 
    destfile = "gct_000a11a_e.zip") 
unzip("gct_000a11a_e.zip", exdir="tracts") # corrected typo 
census_tracts <- readOGR(dsn = "tracts", layer = "gct_000b11a_e") %>% 
    spTransform(CRS('+init=epsg:4326')) 

# Wards 
download.file("http://opendata.toronto.ca/gcc/voting_subdivision_2010_wgs84.zip", 
       destfile = "subdivisions_2010.zip") 
unzip("subdivisions_2010.zip", exdir="wards") 
wards <- readOGR(dsn = "wards", layer = "VOTING_SUBDIVISION_2010_WGS84") %>% 
    spTransform(proj4string(census_tracts)) 

Тогда я подмножество трактатов переписи только те, в палатах:

census_tracts_in_wards <- census_tracts[wards, ] 

У меня есть данные для каждого подопечного с коэффициентом два уровня:

df <- expand.grid(AREA_ID = wards$AREA_ID, factor = as.factor(letters[1:2])) 
df$value <- rnorm(n = nrow(df)) 
[email protected] <- left_join([email protected], df) 

Теперь (наконец, добравшись до моего вопроса) Я бы хотел рассчитать среднее значение в каждом переписном тракте, как совокупность подопечных в каждом участке переписи переписи . Я думаю, что это, как я вычислить среднее для каждой переписи тракта:

ag <- aggregate(x = wards["value"], by = census_tracts_in_wards, FUN = mean) 

Есть ли способ сделать это factor? Я бы хотел, чтобы пространственный фрейм данных содержал колонку factor и колонку для среднего значения value из каждого участка переписи. По существу эквивалент:

result <- df %>% 
    group_by(AREA_ID, factor) %>% 
    summarize(value = mean(value)) 

Но, сгруппированных по CTUID из census_tracts_in_wards вместо AREA_ID в wards.

Как было предложено Pierre Lafortune, синтаксис формулы кажется естественным здесь. Но, ни одна из этих работ:

ag2 <- aggregate(x = wards["value"] ~ wards["factor"], 
    by = census_tracts_in_wards, FUN = mean) 
ag3 <- aggregate(x = wards["value" ~ "factor"], 
    by = census_tracts_in_wards, FUN = mean) 
ag4 <- aggregate(x = wards["value ~ factor"], 
    by = census_tracts_in_wards, FUN = mean) 

Возможно, группировка принадлежит к вызову FUN?

+0

Отметьте формульную формулу для '? Aggregate'. Вы можете включить несколько столбцов для группировки. –

+0

Да, это похоже на естественный синтаксис для этого. Я думал, что что-то вроде подопечных [value-factor] будет работать, но это не так. Наверное, я не понимаю, как интерпретируются пространственные объекты. –

+0

by 'wards @ data <- left_join (wards @ data, df)' вы создали недопустимый объект 'wards', с элементами 1110 polygon и 2220 элементами таблицы атрибутов. Если вы хотите работать только с таблицами, конвертируйте 'wards' в таблицу с' as.data.frame'. Если вы хотите использовать пространственную агрегацию, прочитайте документацию 'sp :: aggregate'. 'aggregate.formula' находится в' base' и ничего не знает о объектах Spatial. –

ответ

1

Подтвержденный Edzer Pebesma, более подробное описание документации sp::aggregate указывает, что FUN применяется к каждому атрибуту x. Таким образом, вместо создания длинной таблицы с столбцом факторов создается два отдельных столбца (по одному для каждого коэффициента).

wards2 <- readOGR(dsn = "wards", layer = "VOTING_SUBDIVISION_2010_WGS84") %>% 
    spTransform(proj4string(census_tracts)) 
[email protected] <- dplyr::select([email protected], AREA_ID) # Drop the other attributes 
df2 <- tidyr::spread(df, factor, value) 
[email protected] <- left_join([email protected], df2) 
ag5 <- aggregate(x = wards2, by = census_tracts_in_wards, FUN = mean) 
[email protected] <- dplyr::select([email protected], -(AREA_ID)) # The mean of AREA_ID is meaningless 
summary(ag5) 
## Object of class SpatialPolygonsDataFrame 
## Coordinates: 
##   min  max 
## x -79.73389 -79.08603 
## y 43.56243 43.89091 
## Is projected: FALSE 
## proj4string : 
## [+init=epsg:4326 +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 
## +towgs84=0,0,0] 
## Data attributes: 
##  a     b    
## Min. :-1.28815 Min. :-1.835409 
## 1st Qu.:-0.24883 1st Qu.:-0.289510 
## Median : 0.01048 Median : 0.008777 
## Mean : 0.02666 Mean :-0.011018 
## 3rd Qu.: 0.25450 3rd Qu.: 0.265358 
## Max. : 1.92769 Max. : 1.399876 
+0

команда 'tidyr :: spread' не работает для меня. –

+0

Это любопытно. Любые полезные сообщения об ошибках? Я просто использую его как удобный способ реструктуризации объекта df в исходном вопросе из длинной таблицы. Решение использовать столбец для каждого фактора в sp :: aggregate специально не требует tidyr. –

+0

Я вижу; ваш второй скрипт предполагает, что вы смешиваете его с первым; теперь это работает для меня.Установка 'areaWeighted = TRUE' в' sp :: aggregate', кажется, дает небольшие, но заметные отличия. –

Смежные вопросы