【问题标题】:How to write a function in r which plots data for each unique value?如何在 r 中编写一个函数,为每个唯一值绘制数据?
【发布时间】:2020-02-13 06:41:58
【问题描述】:

根据温哥华的犯罪数据,我正在尝试编写一个函数来绘制每个社区针对所有类型犯罪的犯罪数量。

以下是我目前所做的:

all_type <- unique(crime$TYPE)

plot_all <- function(x) {

  m <- filter(crime, YEAR %in% c(2003, 2019), TYPE == x) %>%
  ggplot(aes(x= fct_rev(fct_infreq(NEIGHBOURHOOD))))+
  geom_bar(stat = "count")+
  coord_flip()+
  ggtitle(paste("Crime type:", x, sep=" "))+
  labs(x=" ", y="Total incidents, 2003-2019")

  for (i in seq_along(x)){
    result <- {print(m)}
  }
return(result)

}

plot_all(all_type)

但这只会返回第一个列出的犯罪类型的情节,而不是返回每种犯罪类型的单独情节。

【问题讨论】:

  • 我自己是个新手,但是当基于一个因素生成大量数据时,我非常喜欢使用循环,其中i 也用于对数据帧进行子集化。 (不确定这是否是传统的,但我发现它更容易)。

标签: r function loops ggplot2


【解决方案1】:

发布的功能存在一些问题。在下面的代码中,我将绘制一张图的问题与绘制所有图的问题分开。这些问题中的每一个都对应一个函数。

首先,我正在使用的数据可以按照以下说明下载,可以在 RStudio 的 RPubs 上找到:

Crime Data from Vancouver Police Department by Arash Tavassoli (2018-11-05)

url <- "ftp://webftp.vancouver.ca/opendata/csv/crime_csv_all_years.zip"
temp <- tempfile()
download.file(url, temp)
crime <- read.csv(unz(temp, "crime_csv_all_years.csv"))
unlink(temp)

现在是图形代码。

library(dplyr)
library(tidyr)
library(forcats)
library(ggplot2)

plot_one <- function(x, crime) {
  m <- filter(crime, YEAR %in% c(2003, 2019), TYPE == x) %>%
    ggplot(aes(x = fct_rev(fct_infreq(NEIGHBOURHOOD)))) +
    geom_bar(stat = "count") +
    coord_flip() +
    ggtitle(paste("Crime type:", x, sep=" ")) +
    labs(x = " ", y = "Total incidents, 2003-2019")
  m
}

plot_all <- function(crimedata){
  all_type <- unique(crimedata[["TYPE"]])
  g_list <- lapply(all_type, plot_one, crime = crimedata)
  lapply(g_list, print)
  g_list
}

g_all <- plot_all(crime)

【讨论】:

    猜你喜欢
    • 2011-06-16
    • 2019-11-25
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2013-02-14
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多