Как я могу превратить это в AL oop с R? - PullRequest
0 голосов
/ 06 марта 2020

Я запускаю скрипт для вычисления значения для файла, но я должен сделать это для 30 файлов ... Я назвал файлы 1,2,3 ... 30.shp. Как я могу l oop это без копирования / вставки 30 раз и замены 1 на 2 (до 3,4,5..et c) в первой и последней строках?

Дополнительный вопрос: I получить два разных значения для AI C в зависимости от того, полагаюсь ли я на OGR или ST. Почему это?

regions<- readOGR("C:\\Users\\Desktop\\AIC", "1")  

#Add region ID from the existing ID field
regions$region_ID <- regions$ID

#Delete all other columns
regions$ID <- NULL 
regions$TOTPOP_CY_S<- NULL 
regions$umat_Mean<- NULL 

proj4string(regions) <- CRS("+proj=utm +zone=15 +ellps=GRS80 +datum=NAD83")
writeOGR(regions,"C:\\Users\\Desktop\\AIC\\Junk", "regionsA",driver="ESRI Shapefile",overwrite_layer=TRUE)  
regions<- st_read("C:\\Users\\Desktop\\AIC\\Junk", "regionsA") 

names(regions) 

bsu<- readOGR("C:\\Users\\Desktop\\AIC", "Air_Quality")  
writeOGR(bsu,"C:\\Users\\Desktop\\AIC\\Junk", "risk",driver="ESRI Shapefile",overwrite_layer=TRUE)  
bsu<- st_read("C:\\Users\\Desktop\\AIC\\Junk", "risk") 

###Assign each regions with an average spatial join 

bsu_regions_join <- st_join(bsu, left = FALSE, regions["region_ID"])
st_write(bsu_regions_join, "C:\\Users\\Desktop\\AIC\\Junk\\bsu_regions.shp",update=TRUE)
bsu<- readOGR("C:\\Users\\Desktop\\AIC\\Junk", "bsu_regions")  

###Collapse the bsu_re_dec.csv table.
write.csv(bsu, "C:\\Users\\Desktop\\AIC\\Junk\\bsu_join.csv")
bsu_c<- read.csv("C:\\Users\\Desktop\\AIC\\Junk\\bsu_join.csv")  

names(bsu_c)
bsu_reg<- bsu_c %>% group_by(region_ID) %>% summarise(sum(TOTPOP_CY), mean(MEDHINC_CY), mean(Avg_NO2_co),sum(count), mean(d_risk))

names(bsu_reg)

write.csv(bsu_reg, "C:\\Users\\Desktop\\AIC\\Junk\\bsu_AIC.csv",row.names=FALSE)

bsu_aic<- read.csv("C:\\Users\\Desktop\\AIC\\Junk\\bsu_AIC.csv")  


names(bsu_aic)

bsu_aic$risk=(bsu_aic$sum.count/bsu_aic$sum.TOTPOP_CY)

bsu_aic$quartile_inc <- ntile(bsu_aic$mean.MEDHINC_CY,4)
bsu_aic$quartile_air <- ntile(bsu_aic$mean.Avg_NO2_co,4)
bsu_aic$quartile_risk <- ntile(bsu_aic$risk,4)

bsu_aic$quart_inc=as.numeric(bsu_aic$quartile_inc)
bsu_aic$quart_air=as.numeric(bsu_aic$quartile_air)

poissonmodel <- glm(bsu_aic$quartile_risk ~ bsu_aic$quart_inc+ bsu_aic$quart_air, bsu_aic, family = poisson(link = "log"))
summary(poissonmodel)


aic1 = AIC(poissonmodel)

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Сначала создайте вектор с именами файлов:

library(tidyverse)
files_vector <- map_chr(1:30, ~paste0(.x,".sch")) 

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

files_list <- map(files_vector, ~ read.csv)

Затем преобразуйте ваш реально работающий код в пользовательскую функцию и выполните итерации по списку файлов, используя:

map(files_list, ~ custom_function(.x))

Если вам нужно, вы можете отправить параметры в свою пользовательскую функцию:

map(files_list, ~ custom_function(.x), ...)

Я бы также порекомендовал этот потрясающий доклад о функциях карты и пакете purrr по адресу https://www.youtube.com/watch?v=7UlWJWfZO9M

1 голос
/ 06 марта 2020

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

library(tidyverse)

#setup reproducible example
#writes the iris dataframe 3 times to desktop
iris_list <- list(iris, iris, iris)
num <- c(1, 2, 3)
filenames <- paste0("~/Desktop/iris", num, ".csv")
purrr::map2(iris_list, filenames, write.csv)


#list.files returns a character vector of all the files in a given directory 
#see ?list.files for more info
iris_files <- list.files("~/Desktop", pattern = "iris", full.names = TRUE)

#with a loop
read_iris_loop <- list()
for(i in seq_along(iris_files)){
  read_iris_loop[[i]] <- read.csv(iris_files[[i]])
}
#or with map/lapply
read_iris <- purrr::map(iris_files, read.csv)

#loop/map over datasets with your functions using these as a template
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...