• TNT 擂台赛
  • 序言
  • 1 曲线簇
  • 2 直方图的对数坐标
  • 3 绘制地图
  • 4 柱状图的边框
  • 5 从字符串里提取年和月
  • 6 将持续天数转换成每天出现频次
  • 7 从字符串里提取数字并做后续运算
  • 8 数据框筛选重写
  • 9 将数据框分组提取某列最大值并做后续操作
  • 后记
  • Published with bookdown

TNT 擂台赛

6 将持续天数转换成每天出现频次

题目6: 有数据框:

date_df <- data.frame(start = c("06-01", "06-02", "06-03", "06-04", "06-04"), 
                      duration = c(4, 3, 1, 1, 0), stringsAsFactors=FALSE)

start 列是日期,duration 列是从该日期天开始持续的天数。我想最后求得每天出现的频次是多少。

N 版

# 识别日期:
date_df$ystart <- as.Date(
  paste0('2019-', date_df$start))
# 生成所有日期:
date_ls <- mapply(
  function(x1, x2) 
    format(
      seq(from = x1, length.out = x2, by = 1), 
      '%m-%d'), 
  date_df$ystart, date_df$duration)
# 统计频次:
table(unlist(date_ls))
## 
## 06-01 06-02 06-03 06-04 
##     1     2     3     3

T 版

library(lubridate)
get_series = function(start, duration){
  start= as_datetime(start, format="%m-%d")
  end = start + days(duration)
  return(seq(start, end, by="1 day"))
}

rslt = lapply(1:nrow(date_df), function(i){
  rslt = get_series(date_df$start[i], 
                    date_df$duration[i])
  rslt=as.character(rslt)
  return(rslt)
})

table(unlist(rslt))
## 
## 2020-06-01 2020-06-02 2020-06-03 
##          1          2          3 
## 2020-06-04 2020-06-05 
##          5          3

  1. 贡献者为 @Tzhu @tctcab @dapengde @hzxsccm678335 等,来自 https://d.cosx.org/d/420996。↩