Я пытаюсь рассчитать сгруппированные средние значения на основе пространственной агрегации .Пространственное агрегирование с группой по
У меня есть два файла формы: переписные участки и подопечные. Подопечные имеют значение , что я хотел бы усреднить по коэффициенту для каждого участка переписи.
Вот 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?
Отметьте формульную формулу для '? Aggregate'. Вы можете включить несколько столбцов для группировки. –
Да, это похоже на естественный синтаксис для этого. Я думал, что что-то вроде подопечных [value-factor] будет работать, но это не так. Наверное, я не понимаю, как интерпретируются пространственные объекты. –
by 'wards @ data <- left_join (wards @ data, df)' вы создали недопустимый объект 'wards', с элементами 1110 polygon и 2220 элементами таблицы атрибутов. Если вы хотите работать только с таблицами, конвертируйте 'wards' в таблицу с' as.data.frame'. Если вы хотите использовать пространственную агрегацию, прочитайте документацию 'sp :: aggregate'. 'aggregate.formula' находится в' base' и ничего не знает о объектах Spatial. –