[英]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.