这看起来很简单。我可以很容易地在Excel中做到这一点,但我想通过R自动化这一过程。我已经安装了ggplot2。使用我在CSV文件中读取的RStudio。
得到的数据帧有200多行,每行都是新汉普郡的一个小镇。第一列的标题是“城镇”,下面的每一行都有城镇的文本名称(例如,“协和”或“兰开斯特”)。第2列包含每个城镇的数字(每个小学生的开支),CSV文件中该列的标题是"01/02 Elem PPE“-但在使用View()时它显示为"X01.02.Elem.PPE”。列3对每个城镇都有类似的数字,并且它在View()中的标题是"X02.03.Elem.PPE“。第4列到第11列类似。
我只想绘制一行(一个城镇)的列2-11中的数字的折线图。它将显示该城镇每个学生的支出如何随着时间的推移而变化。肯定有一种简单的方法可以做到这一点,但我找不到。
请帮帮忙。我是一个77岁的人,3-50年前有一些编程经验,但直到昨天才刚刚接触R和Rstudio。
发布于 2020-12-06 04:35:59
首先,我将创建一些模仿您的数据的新数据。它应该具有或多或少相同的属性。
library(glue)
library(tidyverse)
set.seed(4314)
mat <- matrix(rpois(40, 5000), ncol=10)
colnames(mat) <- glue("X{sprintf('%2.0f', 1:10)}.{sprintf('%2.0f', 2:11)}.Elem.PPE", sep="") %>%
gsub(". ", ".0", ., fixed=TRUE) %>%
gsub("X ", "X0", ., fixed=TRUE)
df <- tibble(town = c("Concord", "Lancaster", "Manchester", "Nashua"))
df <- bind_cols(df, as_tibble(mat))现在,这就是你要开始的地方。我假设您将csv读取到一个名为df的对象中。为了使绘图更容易,您应该做的第一件事是将数据从宽表单(每个观察一行10列)转换为每个观察1列10行的长表单。我将把它保存在一个名为df2的对象中。tidyr包中包含pivot_longer函数。第一个参数是您想要从宽形式更改为长形式的列,在本例中,它是除town之外的所有列。然后告诉它列名的变量名和值的变量名。然后,出于绘图目的,我只使用了几个正则表达式从X01.02.Elem.PPE转到01/02。
df2 <- df %>%
pivot_longer(-town, names_to="time", values_to="val") %>%
mutate(time = gsub("X(.*)\\.Elem\\.PPE", "\\1", time),
time = gsub("\\.", "/", time))生成的数据框如下所示:
# # A tibble: 40 x 3
# town time val
# <chr> <chr> <int>
# 1 Concord 01/02 4965
# 2 Concord 02/03 4953
# 3 Concord 03/04 5066
# 4 Concord 04/05 5100
# 5 Concord 05/06 4979
# 6 Concord 06/07 5090
# 7 Concord 07/08 5136
# 8 Concord 08/09 5076
# 9 Concord 09/10 5079
# 10 Concord 10/11 4945接下来,我们可以为一个地方绘制一个图(在我们考虑自动化之前)。让我们试试协和。首先,我们将保存要放在x轴上的值:
xlabs <- unique(df2$time)接下来,我们可以使用ggplot()绘制绘图。在下面的代码中,我们首先将数据帧传输到一个过滤器,该过滤器将提取单个城镇的值。过滤后的数据帧被输送到ggplot()函数中。由于数据框中的time是一个字符矢量,因此我们需要将其转换为因子,然后再转换为数值,以绘制线条图。我们添加直线几何图形来绘制直线。然后,我们使用scale_x_continuous()更改x轴标签。labs()函数用于更改x轴和y轴的轴标签。最后,ggtitle()将标题放在绘图的顶部。我也喜欢theme_bw()而不是灰色的背景,但这完全是个人喜好的问题。生成的图如下所示:
df2 %>% filter(town == "Concord") %>%
ggplot(aes(x=as.numeric(as.factor(time)), y=val)) +
geom_line() +
scale_x_continuous(breaks=1:10, labels = xlabs) +
labs(x="Time", y="Spending per Pupil") +
ggtitle("Concord") +
theme_bw()

现在,您提到的下一个部分是自动化-您希望对原始数据框的每一行执行此操作。我们可以这样做。首先,untown从数据中获取town的唯一值。for()循环从1循环到untown中的值数。然后您可以看到"Concord"在上一张图中的位置,我们现在有了untown[i]。我们还在末尾使用ggsave(),并将城镇名称和.png粘贴在一起。这将在R的工作目录中为每个城镇创建一个不同的图。
untown <- unique(df2$town)
for(i in 1:length(untown)){
df2 %>% filter(town == untown[i]) %>%
ggplot(aes(x=as.numeric(as.factor(time)), y=val)) +
geom_line() +
scale_x_continuous(breaks=1:10, labels = xlabs) +
labs(x="Time", y="Spending per Pupil") +
ggtitle(untown[i]) +
theme_bw()
ggsave(glue("{untown[i]}.png"), width=9, height=6)
}https://stackoverflow.com/questions/65161382
复制相似问题