【问题标题】:How to use a cutoff date slider input in the shiny app?如何在闪亮的应用程序中使用截止日期滑块输入?
【发布时间】:2020-05-21 00:12:51
【问题描述】:

我正在创建一个闪亮的应用程序来帮助我的数据框从这里开始......

         Date Street Name State  Cars on Road  Accidents
0  2001-10-01    A Street    MD          3572          1
1  2001-10-02    B Street    MD          1624          1
2  2001-10-03    C Street    MD          1085          0
3  2001-10-04    D Street    MD          5017          0
4  2001-10-05    E Street    MD          2335          1
5  2001-10-06    F Street    MD          1664          0
6  2001-10-07    G Street    MD          5762          0
7  2001-10-08    H Street    MD          3422          0
8  2001-10-09    I Street    MD          1127          1
9  2001-10-10    J Street    MD          4066          1
10 2001-10-11    A Street    MD          4916          1
11 2001-10-12    B Street    MD          5432          1
12 2001-10-13    C Street    MD          1619          1
13 2001-10-14    D Street    MD          1714          1
14 2001-10-15    E Street    MD          3423          0
15 2001-10-16    F Street    MD          1284          0
16 2001-10-17    G Street    MD          4383          0
17 2001-10-18    H Street    MD          3459          0
18 2001-10-19    I Street    MD          1822          1
19 2001-10-20    J Street    MD          2356          1

这是由于来自shiny的sliderInput设置了“2001年10月10日”之前和之后的截止日期...

   Street Name  State  Cars_on_Road.x  Total_Accidents.x  Accident_Rate.x  Cars_on_Road.y  Total_Accidents.y  Accident_Rate.y  Total_Number_of_Cars_on_Road
1     A Street     MD            3572                 1          25.572            4916            0                         0.000  8488
2     B Street     MD            1624                 1          38.799            5432            1                        10.035  7056
3     C Street     MD            1085                 0          33.169            1619            1                        42.596  2704
4     D Street     MD            5017                 0           6.520            1714            1                        40.942  6731
5     E Street     MD            2335                 1          30.978            3423            0                         0.000  5758
6     F Street     MD            1664                 0          21.968            1284            0                         0.000  2947
7     G Street     MD            5762                 0           4.461            4383            0                         0.000  10145
8     H Street     MD            3422                 0          13.381            3459            0                         0.000  6881
9     I Street     MD            1128                 1          56.947            1822            1                        29.674  2950
10    J Street     MD            4066                 1          13.822            2356            1                            28.721  6422 

但是,我一直在努力通过闪亮使数据库看起来像这样。

编辑#1

如果我不使用闪亮,这正是我从第一个数据库创建第二个数据库的方式。坦率地说,我一直在苦苦琢磨如何将响应式代码放入闪亮代码的服务器部分,我不知道如何制作它。

raw_data <- read_csv("C:\\mypath\\myfile.txt")

before_date <- raw_data %>% filter(Date <= as.Date("2001-10-10")) %>% summarize(Cars_on_Road = sum(raw_data$"Cars on Road"), Total_Accidents = sum(Accidents)) %>% mutate(Accident_Rate = round(Total_Accidents/Cars_on_Road*100000,3))
after_date <- raw_data %>% filter(Date > as.Date("2001-10-10")) %>% summarize(Cars_on_Road = sum(raw_data$"Cars on Road"), Total_Accidents = sum(Accidents)) %>% mutate(Accident_Rate = round(Total_Accidents/Cars_on_Road*100000,3))

final <- merge.data.frame(x = before_date, y = after_date, by = "Street Name", all = TRUE) %>% mutate(Total_Cars_on_Road = Cars_on_Road.x + Cars_on_Road.y)

您对此有何建议?非常感谢任何帮助。

【问题讨论】:

  • 您能分享您当前的代码吗?没有它很难看出为什么你的代码没有给你预期的结果。
  • 致@PaulvanOppen,见上面的编辑。
  • 很抱歉,您可以在此处添加创建 DF 的代码或复制 dput 函数的结果吗?否则我必须手动输入你的 DF 来帮助你。
  • @PaulvanOppen 这是另一种表达方式,我想做的是制作一个与此示例完全相同的闪亮散点图link,但使用截止日期作为滑块工具。我希望我的 x 值是截止日期之前的事故率,y 值是截止日期之后的事故率。这就是为什么我试图弄清楚如何以我想要的方式正确组织数据,以便它可以正确地对滑块工具做出反应。
  • 那么有 3 个步骤。第 1 步:获取原始数据并按日期范围过滤(来自闪亮的滑块)。第 2 步:重塑您的数据,使其适合绘制为散点图(使用任何数字列)。第 3 步:使用 ggplot2 绘图并在闪亮的应用程序中显示。这是正确的吗?

标签: r shiny


【解决方案1】:

我对您的问题感到有些困惑,因为我认为数据有点奇怪:为什么每条街道不是每天都有事故和汽车日期,而是成对的日子,中间有 10 天? 但鉴于此,我确实尝试想出一种解决方法。主要挑战是将每组(街道)的列分成两列。

首先,设置主要对象并调用库:

library(dplyr)
library(tidyr)
library(ggplot2)
library(tibble)

set.seed(123)

data <- tibble( # a tibble that looks like yours
  date = seq.Date(from = as.Date("2020/02/01"), length.out = 20, by ="day"),
  street_name = rep(LETTERS[1:10], 2),
  cars = round(runif(n = 20, min = 3000, max = 5000), digits = 0),
  accidents = round(runif(n = 20, min = 0, max = 1), digits = 0)
)

start.date = as.Date("2020/02/01")
end.date = as.Date("2020/02/10")

size <- nrow(data)

然后我需要按 street_name 对数据进行分组,找出每组中的第一行和第二(最后)行,然后更改为宽形状并重新组合。奇怪的代码...

data <- data %>%
  filter(date >= start.date & date <= end.date) %>% # set date range
  group_by(street_name) %>%
  mutate(group = row_number()) %>% # number rows by group
  pivot_wider(names_from = group, # split to columns with column names by group
              values_from = c(cars, accidents)) %>%
  mutate(cars_1 = first(cars_1), # recombine data 
         cars_2 =  last(cars_2),
         accidents_1 = first(accidents_1),
         accidents_2 = last(accidents_2)) %>%
  ungroup() %>%
  slice(1:(size/2)) # we only need first (or last) half of tibble

然后事情就变得简单了:

data <- data %>%
  mutate(accident_rate_1 = accidents_1 / cars_1,
         accident_rate_2 = accidents_2 / cars_2,
         total_cars_on_road = cars_1 + cars_2)

ggplot(data = data, aes(x = accident_rate_1, accident_rate_2)) +
  geom_point()

不确定这是否是您所追求的,希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2021-12-06
    • 2016-11-03
    相关资源
    最近更新 更多