1

我想创建一个地图,显示给定状态的变量值。该数据集包含大约一千个变量,并且处于州级,大约 100 年。

我拥有和工作的代码是:

    plot_usmap(data = database, values = "var1") + scale_fill_continuous(
    low = "white", high = "blue", na.value="light gray", name = "Title of graph", label = scales::comma
  ) + theme(legend.position = "right")

现在我想做的是为大约 15 个变量和 10 年的列表创建这张地图。我通常是 STATA 用户,在那里我可以定义一个变量列表,然后循环遍历变量列表。在本文档“R 快速介绍(针对 Stata 用户)”的第 7 页上,我尝试应用以下解决方案:

vars <- c("database$var1", "database$var2", "database$var3","database$var4", "database$var5", "database$var6", "database$var7", "database$var8", "database$var9", "database$var10", "database$var11", "database$var12")
for(var in vars) {
  v <- get(var)
  plot_usmap(data = darabase, values = "v") + 
    scale_fill_continuous(low = "white", high = "blue", na.value="light gray", name = "v", label = scales::comma) + theme(legend.position = "right")}

使用此代码,我收到错误“get(var) 中的错误:找不到对象 'database$var1'。当我尝试 view(database$var1) 时,它会出现。下一个问题是我想要图形的名称成为变量的标签而不是变量。在上面的示例中,我将整个数据限制为仅包括 1 年,因此如果有设置代码的解决方案,我可以使用整个数据库但仅映射选择年份,那就太好了。

任何见解将不胜感激!我在 R 中读到过,“for”的使用不多,所以如果有更好的方法,请告诉我。

4

1 回答 1

1

基本上它在 R 中没有什么不同。首先,没有必要使用get,通常应该避免使用。其次,虽然 for 循环很好,但更 R-ish 的方式是使用lapply. 特别是在通过ggplot2它进行绘图时,建议使用lapply.

利用一些虚假的示例数据来模仿你的database

library(usmap)
library(ggplot2)

# Example data
database <- statepop
names(database) <- c("fips", "abbr", "full", "var1")
database$var2 <- database$var1

vars <- c("var1", "var2")

lapply(vars, function(x) {
  plot_usmap(data = database, values = x) + 
    scale_fill_continuous(
    low = "white", high = "blue", na.value="light gray", name = "Title of graph", label = scales::comma
  ) + 
    theme(legend.position = "right") +
    labs(title = x)
})
#> [[1]]

#> 
#> [[2]]

编辑假设您的数据包含一个带有年份的列,我建议将绘图代码包装在一个函数中,该函数将您的数据库、变量向量和所需年份作为参数。但是还有其他方法,哪种方法效果最好取决于您想要的结果。

library(usmap)
library(ggplot2)
library(labelled)

# Example data
database <- statepop
names(database) <- c("fips", "abbr", "full", "var1")
database$year <- 2015
database <- rbind(database, transform(database, year = 2020))
var_label(database$var1) <- "Population"

vars <- c("var1")
names(vars) <- vars

map_vars <- function(.data, vars, year) {
  lapply(vars, function(x, year) {
    .data <- .data[.data$year == year, ]
    plot_usmap(data = database, values = x) +
      scale_fill_continuous(
        low = "white", high = "blue", na.value = "light gray", name = "Title of graph", label = scales::comma
      ) +
      theme(legend.position = "right") +
      labs(title = paste(var_label(database[[x]]), "in", year))
  }, year = year)  
}

map_vars(database, vars, 2015)
#> $var1

map_vars(database, vars, 2020)
#> $var1

于 2021-11-20T16:06:37.210 回答