在R中优化散点图生成代码 [英] Optimize code for scatter plot generation in R

查看:9
本文介绍了在R中优化散点图生成代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面的可执行代码根据他选择的日期(date2)生成散点图,并根据所选的星期几(Week)生成三条线,分别是平均值、平均值+标准差和平均值-标准差。

如您所见,我使用向量i来生成平均值和标准差。但我想优化一下这一点,即当他选择日期时,他已经知道是星期几了,所以他不需要使用这个i向量。

例如,我将其设置为生成散点图日期10/04/2021,因此代码需要知道今天是星期六,而不必将向量i设置为3。

你能帮我回答这个问题吗?

下载数据库的链接为:https://docs.google.com/spreadsheets/d/1W_hzuRq7D6X12BdwaXeM-cjg2A5MIKDx/edit?usp=sharing&ouid=102073768617937039119&rtpof=true&sd=true

library(dplyr)
library(ggplot2)
library(tidyr)
library(lubridate)

df<-read_excel('C:/Users/Downloads/database_test1.xlsx')

df<-subset(df,df$date2<df$date1) 

dim_data<-dim(df)

day<-c(seq.Date(from = as.Date(df$date2[1]),
                to = as.Date(df$date2[dim_data[1]]),
                by = "1 day"))

df_grouped <- df %>%
  mutate(across(starts_with("date"), as.Date)) %>% 
  group_by(date2) %>% 
  summarise(Id = first(Id),
            date1 = first(date1),
            Week = first(Week),
            D = first(D),
            D1 = sum(D1)) %>% 
  select(Id,date1,date2,Week,D,D1)

df_grouped <- df_grouped %>% mutate(date1=format(date1,"%d/%m/%Y"),
                                    date2=format(date2,"%d/%m/%Y"))
df_grouped<-data.frame(df_grouped)

DS=c("Thursday","Friday","Saturday") 

i<-3
df_OC<-subset(df_grouped,is.na(D)) 
ds_OC<-subset(df_OC,df_OC$Week==DS[i])

#Mean and Standard Deviation
mean_Week<-mean(as.numeric(ds_OC[,"D1"]) )
sdeviation_Week<-sd(as.numeric(ds_OC[,"D1"]))

#create scatter plot
scatter_date <- function(dt, dta = df) {
  dta %>%
    filter(date2 == ymd(dt)) %>%
    summarize(across(starts_with("DR"), sum)) %>%
    pivot_longer(everything(), names_pattern = "DR(.+)", values_to = "val") %>%
    mutate(name = as.numeric(name)) %>%
    plot(xlab = "Days", ylab = "Types", xlim = c(0, 7),
         ylim = c((min(.$val) %/% 10) * 10, (max(.$val) %/% 10 + 1) * 15))
    abline(h=mean_Week, col='blue') 
    abline(h=(mean_Week + sdeviation_Week), col='green',lty=2) 
    abline(h=(mean_Week - sdeviation_Week), col='orange',lty=2)
}  

scatter_date("2021-04-10",df)

生成的图像

推荐答案

您可以创建查找表:

library(tibble)

lookup <- df %>% 
  select(date2, Week) %>% 
  distinct() %>% 
  mutate(date2 = ymd(date2)) %>% 
  deframe()

lookup
#> 2021-03-04 2021-04-02 2021-04-03 2021-04-08 2021-04-09 2021-04-10 
#> "Thursday"   "Friday" "Saturday" "Thursday"   "Friday" "Saturday" 

现在就这样

lookup["2021-04-10"]
#> "Saturday" 

若要将其与散点图函数一起使用,您需要将部分代码移到函数中。


再提一个优化思路:

# You could put this lines into one pipe
df_grouped <- df %>%
  mutate(across(starts_with("date"), as.Date)) %>% 
  group_by(date2) %>% 
  summarise(Id = first(Id),
            date1 = first(date1),
            Week = first(Week),
            D = first(D),
            D1 = sum(D1)) %>% 
  select(Id, date1, date2, Week, D, D1) %>% 
  mutate(date1 = format(date1, "%d/%m/%Y"),
         date2 = format(date2, "%d/%m/%Y"))

# you don't need this line
# df_grouped<-data.frame(df_grouped)

另外两个提示:

  1. 在";、";之后使用空格。这使代码更易于阅读。
  2. 避免使用不同类型的引号:使用&Quot;或‘不能同时使用两者(除非您拥有以同时使用两者)。

这篇关于在R中优化散点图生成代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆