【问题标题】:Vectorized functions in R's data.tableR 的 data.table 中的向量化函数
【发布时间】:2020-03-26 08:51:29
【问题描述】:

问题:我尝试在下面的 data.table 对象中添加一列,其中每一行都会显示周列表。 IE。如果 START = "2020-01-01" 和 END = "2020-01-15",则周列应包含此时间间隔的相应周列表(2020 W01、2020 W02、2020 W03)。由于代码结构,我想保留单独准备数据的功能。但是,当前函数会导致错误。

问题:有没有办法让它保持简单,即在函数调用 get_weeks 中不引用 data.table 对象?修改后的函数会是什么样子?干杯!

dt <- data.table(
  ID = c(1, 2, 3),
  START = c("2020-01-01", "2020-03-01", "2020-03-14"),
  END = c("2020-01-15", "2020-03-12", "2020-03-26")
)


get_weeks <- function(start_date, end_date){

  date_range <- c(start_date, end_date)
  date_range <- ymd(date_range)

  dt_range <- seq.Date(date_range[1], date_range[2], "day")

  dt_range_week <- list(unique(format(as.Date(dt_range), "%G W%V")))

  dt_range_week
}


dt[, weeks_for_filter_table := get_weeks("START", "END")]

【问题讨论】:

    标签: r data.table vectorization


    【解决方案1】:

    你可以使用Map/mapply

    library(data.table)
    dt[, weeks_for_filter_table := mapply(get_weeks, START, END)]
    dt
    
    #   ID      START        END     weeks_for_filter_table
    #1:  1 2020-01-01 2020-01-15 2020 W01,2020 W02,2020 W03
    #2:  2 2020-03-01 2020-03-12 2020 W09,2020 W10,2020 W11
    #3:  3 2020-03-14 2020-03-26 2020 W11,2020 W12,2020 W13
    

    【讨论】:

    • 谢谢!一个后续问题,我现在尝试过滤对象,例如dt["2020 W01" %in% weeks_for_filter_table] 不幸失败了。你知道如何在这里进行吗? (预期结果:第 1 行)
    • @rkraft weeks_for_filter_table 是一个列表列。您不能直接使用%in% 过滤它们。可能你需要dt[, .SD[sapply(weeks_for_filter_table, function(x) any(x == "2020 W01"))]]
    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2023-03-14
    • 2016-11-03
    相关资源
    最近更新 更多