首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码重构-代码改进建议

代码重构-代码改进建议
EN

Stack Overflow用户
提问于 2020-05-06 08:15:48
回答 1查看 23关注 0票数 0

问题:,我有以下函数,我想用更枯燥的方式编写它。你们中有人有建议如何改进这些功能吗?实际上,该函数接受一个date对象,并在其他列中提取星期、季度、月份和年份。

非常感谢!!

代码语言:javascript
复制
library(data.table)
library(tsibble)

determine_entry_date_aggregations <- function(data, date_col = "OBS_DATE"){
  data[, ":="(entry_date_quarter = yearquarter(get(date_col)),
              entry_date_week = format(get(date_col), "%G W%V"),
              entry_date_month = yearmonth(get(date_col)),
              entry_date_year = year(get(date_col)))]
}
determine_finish_date_aggregations <- function(data, date_col = "FIN_DATE"){
  data[, ":="(finish_date_quarter = yearquarter(get(date_col)),
              finish_date_week = format(get(date_col), "%G W%V"),
              finish_date_month = yearmonth(get(date_col)),
              finish_date_year = year(get(date_col)))]
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-06 08:21:18

这可能是风格的问题。下面是将函数存储在列表中并将date_col作为字符串传递给.SDcols的一个选项

代码语言:javascript
复制
funlist <- list(date_quarter=yearquarter, 
    date_week=function(x) format(x, "%G W%V"), 
    date_month=yearmonth, 
    date_year=year)

determine_date_aggregations <- function(data, date_col="FIN_DATE", out_col="finish"){
    data[, paste(out_col, names(funlist), sep="_") := 
        lapply(funlist, function(f) f(.SD[[1L]])), .SDcols=date_col]
}

或者使用set代替:=

代码语言:javascript
复制
determine_date_aggregations <- function(data, date_col="FIN_DATE", out_col="finish") {
    for (f in names(funlist)) {
        set(data, j=paste(out_col, f, sep="_"),
            value=funlist[[f]](data[[date_col]]))
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61630443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档