【问题标题】:R Programming and GGPLOT2 - how to SUM data to create a line graphR 编程和 GGPLOT2 - 如何对数据求和以创建折线图
【发布时间】:2018-11-09 22:27:54
【问题描述】:

我对 R 非常陌生,我希望使用 GGPLOT2 为我拥有的一组数据创建一个折线图。数据由日期、评论、数量组成 - 有多个日期/评论/数量组合,但我需要做的是将数据放到每个日期和评论组合对数量都有一个值的地方 - 基本上是对它们求和。我知道如何在 SQL 中做到这一点,并且正在使用 sqldf 包来尝试实现相同的目标,但我得到了一行返回。

样本数据:

Date     Comments         BuysToForecast
   <fct>    <fct>                     <int>
 1 4/6/2018 Approved                    573
 2 4/6/2018 ""                          363
 3 4/6/2018 ""                          503
 4 4/6/2018 ""                          324
 5 4/6/2018 Cancelled                  1844
 6 4/6/2018 Consumed By SO's            422
 7 4/6/2018 Consumed By SO's            790
 8 4/6/2018 Reduced                     515
 9 4/6/2018 Reduced                     790
10 4/6/2018 Approved                   1378

例如,我需要的是 = 只有一个 4/5/2018/Consumed By SO's/Qty 值具有所有数量。当我在 sqldf 中使用下面的 SQL 时,我得到了显示的结果:

SQLDF:

dp1 <- sqldf("select Date, 
                     Comments,
                     SUM(BuysToForecast) AS 'SUM' from dp")

head(dp1)(example data): 

       Date Comments     SUM
1 5/30/2018 Approved 2062046

对任何格式问题提前道歉 - 对 R 来说非常新

【问题讨论】:

  • 类似这样的东西:library(tidyverse); library(lubridate); dp1 %&gt;% group_by(Date=mdy(Date), Comments) %&gt;% summarise(BuysToForecast=sum(BuysToForecast)) %&gt;% ggplot(aes(Date, BuysToForecast, colour=Comments)) + geom_line().
  • 谢谢你!这让我得到了我想要的总体画面——代表不同的独特线条。您能否扩展 Date = mdy(Date) 部分,这意味着什么?这张图片也很棒,但它确实改变了轴 - y 现在包含错误值 (4e+05),x 不是数据的日期,而是涵盖这些日期的范围。感谢对新手的帮助,我会继续改进。
  • 如果您提供一个可重现的示例(即重现您的问题的数据示例和代码)将会很有帮助。使用dput 提供数据样本——例如,将dput(dp1[1:20, ]) 的输出粘贴到您的问题中。并提供您正在运行的所有相关代码。

标签: r ggplot2 dplyr sqldf


【解决方案1】:

这是一个假数据示例,我希望它与您的数据相似。

library(tidyverse)
library(lubridate)

# Create fake data
set.seed(2)
n=1e3
dat = data_frame(date = sample(seq(ymd("2015-01-01"), ymd("2015-02-28"), length=60), n, replace=TRUE),
                 comment=sample(LETTERS[1:5], n, replace=TRUE),
                 value=sample(1:100, n, replace=TRUE))

# Convert date to factor to match your data
dat$date = format(dat$date, "%m/%d/%Y")
dat$date = factor(dat$date)

好的,现在我们可以开始了。首先,我们将您的“日期”值转换为 R 的 Date 类。现在您的日期被编码为因子类,这意味着 R 将其视为分类变量。将其转换为 Date 类将导致 ggplot 将它们视为日期,而不是类别。我们将使用 lubridate mdy 函数(月-日-年的缩写,即日期列中值的顺序)。

# Convert date to Date class
dat$date = mdy(dat$date)

现在有两种选择。预先汇总 dat 并将汇总的数据提供给 ggplot:

dat %>% 
  group_by(date, comment) %>% 
  summarise(value=sum(value)) %>% 
  ungroup %>% 
ggplot(aes(date, value, colour=comment)) +
  geom_line() +
  geom_point()

或者,让 ggplot 为您处理摘要:

ggplot(dat, aes(date, value, colour=comment)) +
  stat_summary(fun.y=sum, geom="line") +
  stat_summary(fun.y=sum, geom="point")

不管怎样,情节是这样的:

在这里让 ggplot 做摘要更容易,但有时您会想要在 ggplot 之外处理数据的额外灵活性。

【讨论】:

  • 谢谢你这是完美的 - 我不太习惯 R - 为什么我的 y 轴会扭曲?都是错误数——数据集中最大的数是22000
  • 我不确定您所说的“错误编号”是什么意思,或者您所说的“失真”具体是什么意思。请将您正在运行的代码和您正在制作的情节的图像粘贴到您的问题中。
【解决方案2】:

您需要使用group by 为每个组计算总和。问题中显示的 SQL 语句只要求总和。假设最后注释中的数据(取自问题)。

library(ggplot2)
library(sqldf)

dp <- dp0
dp$Date <- as.Date(dp$Date, "%m/%d/%Y")

dp1 <- sqldf("select Date, Comments, SUM(BuysToForecast) AS 'SUM' 
              from dp 
              group by Date, Comments")

ggplot(dp1, aes(Date, SUM, color = Comments)) + 
  geom_point() +
  geom_line()

注意

Lines <- "Date     Comments         BuysToForecast
 1 4/6/2018 Approved                    573
 2 4/6/2018 \"\"                          363
 3 4/6/2018 \"\"                          503
 4 4/6/2018 \"\"                          324
 5 4/6/2018 \"Cancelled\"                  1844
 6 4/6/2018 \"Consumed By SO's\"            422
 7 4/6/2018 \"Consumed By SO's\"            790
 8 4/6/2018 Reduced                     515
 9 4/6/2018 Reduced                     790
10 4/6/2018 Approved                   1378"

dp0 <- read.table(text = Lines)

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 2014-10-04
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多