如何使用 R 提供每周资料?

Posted

技术标签:

【中文标题】如何使用 R 提供每周资料?【英文标题】:How to provide weekly profile by using R? 【发布时间】:2016-07-16 00:24:49 【问题描述】:

我得到了这样的旅行交易数据集(大约 560000 次旅行):数据框 1

ID        START TIME          DATE          ORIGIN  DESTINATION        DAY
1005          9.10            2012-01-02          A        B          Monday
1005          18.15           2012-01-02          B        A          Monday
1005          9.05            2012-01-08          A        B          Sunday
1005          17.05           2012-01-08          B        A          Sunday
1010          8.00            2012-01-09          A        C          Monday
1010          12.00           2012-01-09          C        A          Monday
1013          13.15           2012-01-10          D        E          Tuesday
1013          15.30           2012-01-10          E        G          Tuesday
1013          9.06            2012-01-12          D        E          Thursday
...            ...            2012-..-..          .        .           ...

和这样的 ID 索引(大约 1986 个 ID):Dataframe 2

 ID   
1005
1010
1013
1015
1030
1034
1036
1031
1040
...

我想根据这两个数据框创建每周旅行资料。我不确定我是否正确,但我尝试了这些代码:

    weekday = c("Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
    br = seq(0,23,by=1)
ranges = paste(head(br,-1), br[-1], sep="_")

            for (i in dataframe2$ID) 

                  for (n in weekday)
                    x= filter(dataframe1,dataframe1$ID %in% i & dataframe1$DAY %in% n)
                    freq = hist(as.numeric(x), br, include.lowest=TRUE, plot=FALSE)
                    df = as.data.frame(t(data.frame(frequency = freq$counts)))
                    df$i = i
                    df$n = n
                    colnames(df) = c(as.character(ranges),"ID","Day")
                    write.table(head(df),file="testdata1.csv", append=TRUE,sep=",",col.names=FALSE,row.names=FALSE)
                  
                

我想最终得到一个包含他们每周旅行频率的 csv 表。我还想问是否有一种简单的方法来简化这项任务。

ID      0_1 1_2 2_3 3_4 4_5 5_6 6_7 7_8 8_9 9_10 10_11 11_12 12_13 13_14 14_15 15_16 16_17 17_18 18_19 19_20 20_21 21_22 22_23  Day
 1005    0   0   0   0   0   0   0   0   0   1     0     0     0     0     0     0     0     1     0     0     0     0     0   Sunday  
 1005    0   0   0   0   0   0   0   0   0   1     0     0     0     0     0     0     0     1     0     0     0     0     0   Monday
 1005    0   0   0   0   0   0   0   0   0   0     0     0     0     0     0     0     0     0     0     0     0     0     0   Tuesday
 1005                                                                                                                         Wednesday
 1005                                                                                                                         Thursday
 1005                                                                                                                           Friday
 1005                                                                                                                        Saturday
 1010                                                                                                                           Sunday
 1010
 1010
 1010
 1010
 1010
 1010

最后我想制作一个这样的图表: enter image description here

【问题讨论】:

最好dput你的数据 【参考方案1】:

这可以在基础 R 中使用函数 xtabs 来完成,但如果我们使用 dplyrtidyr 包来完成它可能会更清楚一些。通过这种方法,weekday 被创建为 R 因子变量。然后使用dplyr 函数mutateDAY 转换为因子,将START_TIME 转换为整数。接下来,我们使用来自tidyr 包的complete 创建一个新的扩展数据框,其中IDDAYDAYSTART_TIME 的每个值使用它们的完整值范围(例如,每个值对应一行) ID,对于每个开始时间 0:23 和一周中的每一天。DATEORIGINDESTINATION 的值在它们存在的地方使用;否则 DATE, ORIGIN,DESTINATION列具有NA 值。每个ID, DAY,START_TIME, 的行程数计算为不具有NA 的行的总和,用于DATE 的值并存储在Freq 中。来自tidyrspread 函数用于将Freq 的每个不同值转换为单独的列。最后分配适当的列名,将列按请求的顺序排列,并将数据帧作为文件写入文件csv.

  library(dplyr)
  library(tidyr)
#
# input data is in df
# convert colunm name START TIME to syntactically correct version START_TIME
#
  colnames(df)[2] <- "START_TIME"
#
# define weekday as a factor with the days of week
#
     weekday <-  c("Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
     weekday <-  factor(weekday, levels=weekday)
#
#  sum number for trips by ID, DAY, and START_TIME
#
     trip_freq <- df %>% mutate(DAY = factor(DAY, levels=levels(weekday)),
                                START_TIME=floor(START_TIME)) %>%
                        complete(ID, DAY=weekday, START_TIME=0:23) %>% 
                        group_by(ID, DAY, START_TIME) %>%
                        summarise(Freq = sum(!is.na(DATE)))
    trip_freq_tbl <- trip_freq %>% spread(key = START_TIME, value=Freq)
#
# name and re-arrange columns
#
  colnames(trip_freq_tbl) <- c("ID", "Day", paste(0:23,1:24,sep="_"))
  trip_freq_tbl <- cbind(trip_freq_tbl[,-2], Day=trip_freq_tbl[,"Day"])            
#
# write trip_freq as csv fle
#
  write.table(trip_freq_tbl, file="testdata1.csv", sep=",", row.names=FALSE)    

你可以进一步总结你的情节的数据

#
# summarize the data for the plot
#
  trip_freq_plot <-  trip_freq %>% group_by(DAY, START_TIME) %>%
                                   summarize(Cnt = sum(Freq)) 

【讨论】:

以上是关于如何使用 R 提供每周资料?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中使用 XGBoost 算法进行回归?

R指定一个月中的哪一周

如何将现实世界 5 天的每日股票数据转换为每周模式以获得每周移动平均线

我如何对 Slackbot 进行编程以每周自动发送常规消息

每周小结

每周思考 | 关于如何制定目标的一些想法