自动化R

时间:2017-01-08 08:48:01

标签: r function loops ggplot2

我最近完成了一个项目,涉及采用一个覆盖15年的数据集,并使每年成为幻灯片。我每年手动将数据从数据转换成情节。我相信,根据这些知识,我可以编写一个循环或函数,可以在很短的时间内完成。特别是由于利益相关者不断改变他们的想法,这需要一整轮“编码”。

这是我正在使用的完整代码:

> packages <- c(“ggplot2”, “rgdal”, “scales”, “ggmap”, “dplyr”, “Cairo”, “maptools”, “gpclib”)
> lapply(packages, require, character.only = TRUE)
> gpclibPermit()   

## read in shapefiles; subset to state level 
> us <- readOGR(dsn = “Data”, layer = “cb_2015_us_county_500k”)
> state <- subset(us, STATEFP == 41)
> state <- fortify(state, region = “NAME”)
> county <- readOGR(dsn = “Data”, layer = “cb_2015_us_county_500k”)
> county <- subset(county, STATEFP == 41)
> county <- fortify(county, region = “NAME”)

## read in data; attach to shapefile
> data <- read.csv(file = “Data/data.csv”, head = TRUE, sep = “,”)
> data$id <- as.character(data$id)
> plotData_n <- left_join(state, data)

## create plot for individual year; save as png; REPEAT FOR EACH YEAR
map2001 <- ggplot() +
+ geom_polygon(data = plotData, aes(x = long, y = lat, group = group, fill = y2001)) +
+ geom_polygon(data = county, aes(x = long, y = lat, group = group), fill = NA, color = “black”, size = 0.25) +
+ coord_map() +
+ scale_fill_distiller(palette = “Blues”, name = “2001”, direction = 1, breaks = with(plotData, c(min(y2001), mean(y2001), max(y2001))), labels = c(“”, “Avg.”, “”)) +
+ remAxes <- theme_nothing(legend = TRUE) +
+ addTitle <- labs(title = “Rate of blah, blah, blah”, fill = “”)

> ggsave(map2001, file = "map2001.png", width = 5, height = 4.5, type = "cairo-png")

我如何在r中自动执行此过程?我将如何编写一个函数或循环来执行此操作并返回一个我可以用来保存图像的对象?

这是数据前50行的dput():

structure(list(long = c(-118.518058, -118.517858, -118.518357, 
-118.516857, -118.517157, -118.519257, -118.518557, -118.510057, 
-118.504057, -118.502169, -118.501909, -118.49966, -118.498453, 
-118.498245, -118.498157, -118.497757, -118.497408, -118.497257, 
-118.496857, -118.496457, -118.495957, -118.495804, -118.495368, 
-118.492357, -118.491357, -118.488257, -118.483757, -118.476457, 
-118.472357, -118.470257, -118.468257, -118.464256, -118.463556, 
-118.461656, -118.460656, -118.461657, -118.460357, -118.459157, 
-118.449256, -118.445556, -118.443056, -118.437956, -118.433856, 
-118.431756, -118.430856, -118.424256, -118.422756, -118.419156, 
-118.420056, -118.417856), lat = c(44.693275, 44.695275, 44.698574, 
44.701974, 44.703774, 44.706374, 44.706674, 44.706774, 44.706474, 
44.707169, 44.708337, 44.70918, 44.710691, 44.710785, 44.710874, 
44.711174, 44.711312, 44.711374, 44.711774, 44.712074, 44.712474, 
44.712574, 44.712866, 44.713774, 44.712574, 44.711074, 44.710074, 
44.709174, 44.704774, 44.704274, 44.705674, 44.706274, 44.707274, 
44.707374, 44.709174, 44.711774, 44.712874, 44.715774, 44.720973, 
44.723473, 44.724273, 44.721773, 44.720873, 44.721273, 44.719373, 
44.718774, 44.719573, 44.718674, 44.721873, 44.722873), order = 1:50, 
    hole = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), piece = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L), .Label = c("1", "2", "3", "4", "5"), class = "factor"), 
    id = c("Baker", "Baker", "Baker", "Baker", "Baker", "Baker", 
    "Baker", "Baker", "Baker", "Baker", "Baker", "Baker", "Baker", 
    "Baker", "Baker", "Baker", "Baker", "Baker", "Baker", "Baker", 
    "Baker", "Baker", "Baker", "Baker", "Baker", "Baker", "Baker", 
    "Baker", "Baker", "Baker", "Baker", "Baker", "Baker", "Baker", 
    "Baker", "Baker", "Baker", "Baker", "Baker", "Baker", "Baker", 
    "Baker", "Baker", "Baker", "Baker", "Baker", "Baker", "Baker", 
    "Baker", "Baker"), group = structure(c(1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L
    ), .Label = c("Baker.1", "Benton.1", "Clackamas.1", "Clatsop.1", 
    "Clatsop.2", "Clatsop.3", "Clatsop.4", "Clatsop.5", "Columbia.1", 
    "Coos.1", "Crook.1", "Curry.1", "Curry.2", "Curry.3", "Curry.4", 
    "Deschutes.1", "Douglas.1", "Gilliam.1", "Grant.1", "Harney.1", 
    "Hood River.1", "Jackson.1", "Jefferson.1", "Josephine.1", 
    "Klamath.1", "Lake.1", "Lane.1", "Lincoln.1", "Linn.1", "Malheur.1", 
    "Marion.1", "Morrow.1", "Multnomah.1", "Polk.1", "Sherman.1", 
    "Tillamook.1", "Umatilla.1", "Union.1", "Wallowa.1", "Wasco.1", 
    "Washington.1", "Wheeler.1", "Yamhill.1"), class = "factor"), 
    y2001 = c(0.467065868, 0.467065868, 0.467065868, 0.467065868, 
    0.467065868, 0.467065868, 0.467065868, 0.467065868, 0.467065868, 
    0.467065868, 0.467065868, 0.467065868, 0.467065868, 0.467065868, 
    0.467065868, 0.467065868, 0.467065868, 0.467065868, 0.467065868, 
    0.467065868, 0.467065868, 0.467065868, 0.467065868, 0.467065868, 
    0.467065868, 0.467065868, 0.467065868, 0.467065868, 0.467065868, 
    0.467065868, 0.467065868, 0.467065868, 0.467065868, 0.467065868, 
    0.467065868, 0.467065868, 0.467065868, 0.467065868, 0.467065868, 
    0.467065868, 0.467065868, 0.467065868, 0.467065868, 0.467065868, 
    0.467065868, 0.467065868, 0.467065868, 0.467065868, 0.467065868, 
    0.467065868), y2002 = c(0.383337472, 0.383337472, 0.383337472, 
    0.383337472, 0.383337472, 0.383337472, 0.383337472, 0.383337472, 
    0.383337472, 0.383337472, 0.383337472, 0.383337472, 0.383337472, 
    0.383337472, 0.383337472, 0.383337472, 0.383337472, 0.383337472, 
    0.383337472, 0.383337472, 0.383337472, 0.383337472, 0.383337472, 
    0.383337472, 0.383337472, 0.383337472, 0.383337472, 0.383337472, 
    0.383337472, 0.383337472, 0.383337472, 0.383337472, 0.383337472, 
    0.383337472, 0.383337472, 0.383337472, 0.383337472, 0.383337472, 
    0.383337472, 0.383337472, 0.383337472, 0.383337472, 0.383337472, 
    0.383337472, 0.383337472, 0.383337472, 0.383337472, 0.383337472, 
    0.383337472, 0.383337472), y2003 = c(0.769961724, 0.769961724, 
    0.769961724, 0.769961724, 0.769961724, 0.769961724, 0.769961724, 
    0.769961724, 0.769961724, 0.769961724, 0.769961724, 0.769961724, 
    0.769961724, 0.769961724, 0.769961724, 0.769961724, 0.769961724, 
    0.769961724, 0.769961724, 0.769961724, 0.769961724, 0.769961724, 
    0.769961724, 0.769961724, 0.769961724, 0.769961724, 0.769961724, 
    0.769961724, 0.769961724, 0.769961724, 0.769961724, 0.769961724, 
    0.769961724, 0.769961724, 0.769961724, 0.769961724, 0.769961724, 
    0.769961724, 0.769961724, 0.769961724, 0.769961724, 0.769961724, 
    0.769961724, 0.769961724, 0.769961724, 0.769961724, 0.769961724, 
    0.769961724, 0.769961724, 0.769961724), y2004 = c(0.674740033, 
    0.674740033, 0.674740033, 0.674740033, 0.674740033, 0.674740033, 
    0.674740033, 0.674740033, 0.674740033, 0.674740033, 0.674740033, 
    0.674740033, 0.674740033, 0.674740033, 0.674740033, 0.674740033, 
    0.674740033, 0.674740033, 0.674740033, 0.674740033, 0.674740033, 
    0.674740033, 0.674740033, 0.674740033, 0.674740033, 0.674740033, 
    0.674740033, 0.674740033, 0.674740033, 0.674740033, 0.674740033, 
    0.674740033, 0.674740033, 0.674740033, 0.674740033, 0.674740033, 
    0.674740033, 0.674740033, 0.674740033, 0.674740033, 0.674740033, 
    0.674740033, 0.674740033, 0.674740033, 0.674740033, 0.674740033, 
    0.674740033, 0.674740033, 0.674740033, 0.674740033), y2005 = c(0.712707334, 
    0.712707334, 0.712707334, 0.712707334, 0.712707334, 0.712707334, 
    0.712707334, 0.712707334, 0.712707334, 0.712707334, 0.712707334, 
    0.712707334, 0.712707334, 0.712707334, 0.712707334, 0.712707334, 
    0.712707334, 0.712707334, 0.712707334, 0.712707334, 0.712707334, 
    0.712707334, 0.712707334, 0.712707334, 0.712707334, 0.712707334, 
    0.712707334, 0.712707334, 0.712707334, 0.712707334, 0.712707334, 
    0.712707334, 0.712707334, 0.712707334, 0.712707334, 0.712707334, 
    0.712707334, 0.712707334, 0.712707334, 0.712707334, 0.712707334, 
    0.712707334, 0.712707334, 0.712707334, 0.712707334, 0.712707334, 
    0.712707334, 0.712707334, 0.712707334, 0.712707334), y2006 = c(0.727825718, 
    0.727825718, 0.727825718, 0.727825718, 0.727825718, 0.727825718, 
    0.727825718, 0.727825718, 0.727825718, 0.727825718, 0.727825718, 
    0.727825718, 0.727825718, 0.727825718, 0.727825718, 0.727825718, 
    0.727825718, 0.727825718, 0.727825718, 0.727825718, 0.727825718, 
    0.727825718, 0.727825718, 0.727825718, 0.727825718, 0.727825718, 
    0.727825718, 0.727825718, 0.727825718, 0.727825718, 0.727825718, 
    0.727825718, 0.727825718, 0.727825718, 0.727825718, 0.727825718, 
    0.727825718, 0.727825718, 0.727825718, 0.727825718, 0.727825718, 
    0.727825718, 0.727825718, 0.727825718, 0.727825718, 0.727825718, 
    0.727825718, 0.727825718, 0.727825718, 0.727825718), y2007 = c(0.701523911, 
    0.701523911, 0.701523911, 0.701523911, 0.701523911, 0.701523911, 
    0.701523911, 0.701523911, 0.701523911, 0.701523911, 0.701523911, 
    0.701523911, 0.701523911, 0.701523911, 0.701523911, 0.701523911, 
    0.701523911, 0.701523911, 0.701523911, 0.701523911, 0.701523911, 
    0.701523911, 0.701523911, 0.701523911, 0.701523911, 0.701523911, 
    0.701523911, 0.701523911, 0.701523911, 0.701523911, 0.701523911, 
    0.701523911, 0.701523911, 0.701523911, 0.701523911, 0.701523911, 
    0.701523911, 0.701523911, 0.701523911, 0.701523911, 0.701523911, 
    0.701523911, 0.701523911, 0.701523911, 0.701523911, 0.701523911, 
    0.701523911, 0.701523911, 0.701523911, 0.701523911), y2008 = c(0.799278072, 
    0.799278072, 0.799278072, 0.799278072, 0.799278072, 0.799278072, 
    0.799278072, 0.799278072, 0.799278072, 0.799278072, 0.799278072, 
    0.799278072, 0.799278072, 0.799278072, 0.799278072, 0.799278072, 
    0.799278072, 0.799278072, 0.799278072, 0.799278072, 0.799278072, 
    0.799278072, 0.799278072, 0.799278072, 0.799278072, 0.799278072, 
    0.799278072, 0.799278072, 0.799278072, 0.799278072, 0.799278072, 
    0.799278072, 0.799278072, 0.799278072, 0.799278072, 0.799278072, 
    0.799278072, 0.799278072, 0.799278072, 0.799278072, 0.799278072, 
    0.799278072, 0.799278072, 0.799278072, 0.799278072, 0.799278072, 
    0.799278072, 0.799278072, 0.799278072, 0.799278072), y2009 = c(0.780469272, 
    0.780469272, 0.780469272, 0.780469272, 0.780469272, 0.780469272, 
    0.780469272, 0.780469272, 0.780469272, 0.780469272, 0.780469272, 
    0.780469272, 0.780469272, 0.780469272, 0.780469272, 0.780469272, 
    0.780469272, 0.780469272, 0.780469272, 0.780469272, 0.780469272, 
    0.780469272, 0.780469272, 0.780469272, 0.780469272, 0.780469272, 
    0.780469272, 0.780469272, 0.780469272, 0.780469272, 0.780469272, 
    0.780469272, 0.780469272, 0.780469272, 0.780469272, 0.780469272, 
    0.780469272, 0.780469272, 0.780469272, 0.780469272, 0.780469272, 
    0.780469272, 0.780469272, 0.780469272, 0.780469272, 0.780469272, 
    0.780469272, 0.780469272, 0.780469272, 0.780469272), y2010 = c(0.727604813, 
    0.727604813, 0.727604813, 0.727604813, 0.727604813, 0.727604813, 
    0.727604813, 0.727604813, 0.727604813, 0.727604813, 0.727604813, 
    0.727604813, 0.727604813, 0.727604813, 0.727604813, 0.727604813, 
    0.727604813, 0.727604813, 0.727604813, 0.727604813, 0.727604813, 
    0.727604813, 0.727604813, 0.727604813, 0.727604813, 0.727604813, 
    0.727604813, 0.727604813, 0.727604813, 0.727604813, 0.727604813, 
    0.727604813, 0.727604813, 0.727604813, 0.727604813, 0.727604813, 
    0.727604813, 0.727604813, 0.727604813, 0.727604813, 0.727604813, 
    0.727604813, 0.727604813, 0.727604813, 0.727604813, 0.727604813, 
    0.727604813, 0.727604813, 0.727604813, 0.727604813), y2011 = c(0.626036585, 
    0.626036585, 0.626036585, 0.626036585, 0.626036585, 0.626036585, 
    0.626036585, 0.626036585, 0.626036585, 0.626036585, 0.626036585, 
    0.626036585, 0.626036585, 0.626036585, 0.626036585, 0.626036585, 
    0.626036585, 0.626036585, 0.626036585, 0.626036585, 0.626036585, 
    0.626036585, 0.626036585, 0.626036585, 0.626036585, 0.626036585, 
    0.626036585, 0.626036585, 0.626036585, 0.626036585, 0.626036585, 
    0.626036585, 0.626036585, 0.626036585, 0.626036585, 0.626036585, 
    0.626036585, 0.626036585, 0.626036585, 0.626036585, 0.626036585, 
    0.626036585, 0.626036585, 0.626036585, 0.626036585, 0.626036585, 
    0.626036585, 0.626036585, 0.626036585, 0.626036585), y2012 = c(0.59350608, 
    0.59350608, 0.59350608, 0.59350608, 0.59350608, 0.59350608, 
    0.59350608, 0.59350608, 0.59350608, 0.59350608, 0.59350608, 
    0.59350608, 0.59350608, 0.59350608, 0.59350608, 0.59350608, 
    0.59350608, 0.59350608, 0.59350608, 0.59350608, 0.59350608, 
    0.59350608, 0.59350608, 0.59350608, 0.59350608, 0.59350608, 
    0.59350608, 0.59350608, 0.59350608, 0.59350608, 0.59350608, 
    0.59350608, 0.59350608, 0.59350608, 0.59350608, 0.59350608, 
    0.59350608, 0.59350608, 0.59350608, 0.59350608, 0.59350608, 
    0.59350608, 0.59350608, 0.59350608, 0.59350608, 0.59350608, 
    0.59350608, 0.59350608, 0.59350608, 0.59350608), y2013 = c(0.573933154, 
    0.573933154, 0.573933154, 0.573933154, 0.573933154, 0.573933154, 
    0.573933154, 0.573933154, 0.573933154, 0.573933154, 0.573933154, 
    0.573933154, 0.573933154, 0.573933154, 0.573933154, 0.573933154, 
    0.573933154, 0.573933154, 0.573933154, 0.573933154, 0.573933154, 
    0.573933154, 0.573933154, 0.573933154, 0.573933154, 0.573933154, 
    0.573933154, 0.573933154, 0.573933154, 0.573933154, 0.573933154, 
    0.573933154, 0.573933154, 0.573933154, 0.573933154, 0.573933154, 
    0.573933154, 0.573933154, 0.573933154, 0.573933154, 0.573933154, 
    0.573933154, 0.573933154, 0.573933154, 0.573933154, 0.573933154, 
    0.573933154, 0.573933154, 0.573933154, 0.573933154), y2014 = c(0.644163844, 
    0.644163844, 0.644163844, 0.644163844, 0.644163844, 0.644163844, 
    0.644163844, 0.644163844, 0.644163844, 0.644163844, 0.644163844, 
    0.644163844, 0.644163844, 0.644163844, 0.644163844, 0.644163844, 
    0.644163844, 0.644163844, 0.644163844, 0.644163844, 0.644163844, 
    0.644163844, 0.644163844, 0.644163844, 0.644163844, 0.644163844, 
    0.644163844, 0.644163844, 0.644163844, 0.644163844, 0.644163844, 
    0.644163844, 0.644163844, 0.644163844, 0.644163844, 0.644163844, 
    0.644163844, 0.644163844, 0.644163844, 0.644163844, 0.644163844, 
    0.644163844, 0.644163844, 0.644163844, 0.644163844, 0.644163844, 
    0.644163844, 0.644163844, 0.644163844, 0.644163844), y2015 = c(0.665388683, 
    0.665388683, 0.665388683, 0.665388683, 0.665388683, 0.665388683, 
    0.665388683, 0.665388683, 0.665388683, 0.665388683, 0.665388683, 
    0.665388683, 0.665388683, 0.665388683, 0.665388683, 0.665388683, 
    0.665388683, 0.665388683, 0.665388683, 0.665388683, 0.665388683, 
    0.665388683, 0.665388683, 0.665388683, 0.665388683, 0.665388683, 
    0.665388683, 0.665388683, 0.665388683, 0.665388683, 0.665388683, 
    0.665388683, 0.665388683, 0.665388683, 0.665388683, 0.665388683, 
    0.665388683, 0.665388683, 0.665388683, 0.665388683, 0.665388683, 
    0.665388683, 0.665388683, 0.665388683, 0.665388683, 0.665388683, 
    0.665388683, 0.665388683, 0.665388683, 0.665388683)), .Names = c("long", 
"lat", "order", "hole", "piece", "id", "group", "y2001", "y2002", 
"y2003", "y2004", "y2005", "y2006", "y2007", "y2008", "y2009", 
"y2010", "y2011", "y2012", "y2013", "y2014", "y2015"), row.names = c(NA, 
50L), class = "data.frame")

1 个答案:

答案 0 :(得分:2)

在编程中,当人们想到一系列类似命名的变量时,通常需要时间将它们以某种方式组合成一个,也许使用数组。在R中,用于组合复杂和/或不同变量的适当结构是list

R中的For循环与for (var in sequence) { loop body with var }一样简单。

将新数据附加到R中的列表的简单方法是键控赋值:list[[key]] <- value。我们将使用years作为键,但会将它们转换为字符串。否则,list[[2002]] <- data之类的分配将导致list包含2001个空元素。

由于您的数据存储在名为plotData的列中名为y{year}的data.frame中,我们会将变量列名作为字符串传递给aes_string函数,并使用{{1}函数通过get调用中的字符串变量名访问数据。

因此,

with