Использовать purrr() вместо произвольных пар город / графство в тидиценсусе?
У меня есть гигантский запуск, чтобы загрузить файл данных. Но это кажется неуклюжим. Но mapply не кажется правильным, так как я не хочу всех комбинаций штат / округ. Я слышал хорошие вещи о карте (). Кто-нибудь может привести пример того, как я могу использовать команду purrr () 'map' для следующего кода?
library(tidycensus)
library(sf)
mykey<-"youhavetogetyourownimafraid"
#variables to test out the function#############
x<-"06"
y<-"073"
z<-"2000"
setwd("N:/Dropbox/_BonesFirst/149_Transit_Metros_BG_StateSplit_by_R")
##################now the actual function#########################
get_Census <- function(x,y,z) {
name<-paste0("transitmetro_",x,"_",y,"_",z)
name
namefile<-get_decennial(geography = "block group",
variables = "P001001",
sumfile = "sf1",
key = mykey,
state = x, county = y,year = z,
geometry = TRUE)
st_write(namefile, paste0(name,".shp")) #tidycensus version of write OGR
}
#now, for all of them
CO<-c("013")
tibble04_10<-lapply(CO,get_Census,x="04",z="2000")
CO<-c("067","073","113")
tibble06_10<-lapply(CO,get_Census,x="06",z="2000")
CO<-c("005","031","035")
tibble08_10<-lapply(CO,get_Census,x="08",z="2000")
CO<-c("037","053","123")
tibble27_10<-lapply(CO,get_Census,x="27",z="2000")
CO<-c("119")
tibble37_10<-lapply(CO,get_Census,x="37",z="2000")
CO<-c("085","113","121","201")
tibble48_10<-lapply(CO,get_Census,x="48",z="2000")
CO<-c("035") #SLCO, utah
tibble49_10<-lapply(CO,get_Census,x="49",z="2000")
CO<-c("033","053") #King co, Seattle
tibble53_10<-lapply(CO,get_Census,x="53",z="2000")
РЕДАКТИРОВАТЬ
get_Census <- function(x,y,z) {
name<-paste0("transitmetro_",x,"_",y,"_",z)
name
namefile<-get_decennial(geography = "block group",
variables = "P001001",
sumfile = "sf1",
key = mykey,
state = x, county = y,year = z,
geometry = TRUE)
st_write(namefile, paste0(name,".shp")) #tidycensus version of write OGR
}
CO_list <- list(c("013"),
c("067","073","113"),
c("005","031","035"),
c("037","053","123"),
c("119"),
c("085","113","121","201"),
c("035"),
c("033","053"))
x_list <- c("04", "06", "08", "27", "37", "48", "49", "53")
z_list <- c("2000", "2000", "2000", "2000", "2000", "2000", "2000", "2000")
# BUILD LIST OF OBJECTS
tibble_list <- Map(function(CO, x, z) lapply(CO, function(i) get_Census(i, x, z)),
CO_list, x_list, z_list)
# NAME LIST OF OBJECTS: tibble04_10, tibble06_10, tibble08_10, ...
tibble_list <- setNames(tibble_list, paste0("tibble", x_list, "_10"))
print(tibble_list)
Урожайность:
Получение данных из переписи 2000 года Ошибка: результат 1 не является атомным вектором длины 1 Кроме того: Предупреждающие сообщения: 1: "004" не является допустимым кодом FIPS для округов в Грузии
2: "004" не является действительным кодом FIPS для округов в Грузии.
Показать трассировку
Повторно выполнить с ошибкой отладки в collect_(data, key_col = compat_as_lazy(enquo(key)), value_col = compat_as_lazy(enquo(value)),: неиспользованный аргумент (-NAME)
2 ответа
Пересмотреть базовое семейство R, а именно Map
(обертка mapply
) а также lapply
о которых я слышу хорошие вещи. Просто создайте списки равной длины для передачи во вложенный вызов функции.
CO_list <- list(c("013"),
c("067","073","113"),
c("005","031","035"),
c("037","053","123"),
c("119"),
c("085","113","121","201"),
c("035"),
c("033","053"))
x_list <- c("04", "06", "08", "27", "37", "48", "49", "53")
z_list <- c("2000", "2000", "2000", "2000", "2000", "2000", "2000", "2000")
# BUILD LIST OF OBJECTS
tibble_list <- Map(function(CO, x, z) lapply(CO, function(i) get_Census(i, x, z)),
CO_list, x_list, z_list)
# NAME LIST OF OBJECTS: tibble04_10, tibble06_10, tibble08_10, ...
tibble_list <- setNames(tibble_list, paste0("tibble", x_list, "_10"))
Кроме того, поскольку z_list все равно является избыточным, вы можете сократить:
tibble_list <- Map(function(CO, x) lapply(CO, function(i) get_Census(i, x, z=2000)),
CO_list, x_list)
Ты можешь использовать map
от purrr
отобразить список характеристик вашего округа. Одним из способов сделать это является список списков, например:
fips_yrs <- list(
sl_co = list(x = "49", y = "035", z = 2000),
king_co = list(x = "53", y = "053", z = 2000)
)
затем map
будет отображаться в каждом округе, и вы можете извлечь его информацию по имени с [[1]]
,
map(fips_yrs, ~get_Census(x = .$x[[1]], y = .$y[[1]], z = .$z[[1]]))
К вашему сведению, если вам нужны только шейп-файлы, tidycensus
использует функции из tigris
скачать его шейп-файлы, чтобы вы могли просто позвонить tigris
функционировать напрямую.