簡體   English   中英

阻止地圖將日期轉換為數字

[英]Stop Map from converting dates to digits

我有一個功能,可以找到給定日期的一周的第一天。 在這個特殊的問題上,星期幾從星期四開始。

該功能適用​​於各個日期。

week_commencing <- function(date) {
  weekday <- lubridate::wday(date)
  if (weekday >= 5) { 
    return(date - lubridate::days(weekday) + lubridate::days(5))
  } else {
    return(date - lubridate::days(weekday) - lubridate::days(2))
  } 
}

現在,我想將它與dplyr一起使用。 所以我修改了它以接受Map列。

week_commencing <- function(dates) {
  Map(function(date) {
    weekday <- lubridate::wday(date)
    if (weekday >= 5) { 
      return(date - lubridate::days(weekday) + lubridate::days(5))
    } else {
      return(date - lubridate::days(weekday) - lubridate::days(2))
    } 
  },dates)
}

我認為該功能有效,但同時對日期應用了一些奇怪的強制,因為我最終使用數字日期。

> test <- data.frame(datetime=seq.Date(as.Date("2016-06-01"),as.Date("2016-06-10"), by='day'))
> test
     datetime
1  2016-06-01
2  2016-06-02
3  2016-06-03
4  2016-06-04
5  2016-06-05
6  2016-06-06
7  2016-06-07
8  2016-06-08
9  2016-06-09
10 2016-06-10

> test %>% mutate(datetime=week_commencing(datetime))
   datetime
1     16947
2     16954
3     16954
4     16954
5     16954
6     16954
7     16954
8     16954
9     16961
10    16961

關於如何以正常日期對象結束的任何想法? 地圖是否總是施加強制性?

我不知道為什么將class屬性放在這里(使用其他* apply函數時也會發生同樣的情況)。 —從unlist ,問題似乎在於unlist刪除類:

> unlist(list(structure(1, class = 'foo')))
[1] 1

但是解決方法很簡單:將類放在最后。

此外,我建議不要使用Map (它返回一個list ),而是使用vapply 然后我們剩下:

week_commencing <- function(dates) {
  wc <- function(date) {
    weekday <- lubridate::wday(date)
    if (weekday >= 5) { 
      return(date - lubridate::days(weekday) + lubridate::days(5))
    } else {
      return(date - lubridate::days(weekday) - lubridate::days(2))
    } 
  }

  structure(vapply(dates, wc, numeric(1)), class = 'Date')
}

您也可以在該函數上使用Vectorize ,但這也會刪除class屬性。

或者,您可以將其保留在dplyr系列中:

week_commencing <- function(date) {
  weekday <- lubridate::wday(date)
  dplyr::if_else(weekday >= 5,
                 date - lubridate::days(weekday) + lubridate::days(5),
                 date - lubridate::days(weekday) - lubridate::days(2))
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM