【问题标题】:R: Creating multiple maps using a loop through variable namesR:使用循环通过变量名创建多个映射
【发布时间】:2021-12-30 22:52:25
【问题描述】:

我想创建一个地图,显示给定状态的变量值。该数据集包含大约一千个变量,并且处于州级,大约存在 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 用户,在那里我可以定义一个变量列表,然后循环遍历变量列表。在本文档“A Quick Introduction to R (for Stata Users)”的第 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'。当我尝试查看 (database$var1) 时,它会出现。下一个问题是我想要名称将图表的标签作为变量而不是变量的标签。在上面的示例中,我将整个数据限制为仅包括 1 年,因此如果有解决方案来设置代码,我可以使用整个数据库但地图只能选择年份,那太好了。

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

【问题讨论】:

    标签: r loops maps apply usmap


    【解决方案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
    

    【讨论】:

    • 谢谢!那行得通。你知道我将如何更改地图的标题以对应于变量标签而不是变量名吗?例如,``` library(labelled) var_label(statepop$pop_2015)
    • 嗨皮埃尔。第一个问题很简单。如果您的数据已经被标记,您可以使用+ labs(title = labelled::var_label(database[[x]])) 将变量标签添加为标题。此外,除了 lapply 之外,还有 mapply 允许循环多个列表。最后,我只是进行了编辑,以展示一种方法,用于处理您的数据何时包含多年以及如何将它们添加到标题中。
    猜你喜欢
    • 2022-01-22
    • 2018-12-07
    • 2018-02-18
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多