2015-06-10 20 views
2

我有一個日期向量和一個天數向量。在日期和減號函數中使用lapply

dates <- seq(Sys.Date(), Sys.Date()+10, by='day') 
number.of.days <- 1:4 

我需要得到一個清單,每個數字 - 的 - 天,其中列表中的每個條目的日期矢量減去數對應的天,即,

list(dates-1, dates-2, dates-3, dates-4) 
條目

-function (e1, e2) .Primitive("-"))的定義表明其第一個和第二個參數分別爲e1e2。所以以下應該工作。

lapply(number.of.days, `-`, e1=dates) 

但它引發了一個錯誤。

錯誤-.Date(X [[I]],...):只能從 「日期」 對象減去

此外,下面的確實工作:

lapply(number.of.days, function(e1, e2) e1 - e2, e1=dates) 

這是功能還是錯誤?

+0

無關的主題,'地圖'會更容易。 '地圖(' - ',列表(日期),number.of.days)' – akrun

+0

這實際上是我現在使用的。謝謝。 –

回答

3

您可以使用:問題的

lapply(number.of.days, `-.Date`, e1=dates) 

部分是-是一種原始它沒有做參數匹配。請注意如何,這些都是一樣的:

> `-`(e1=5, e2=3) 
[1] 2 
> `-`(e2=5, e1=3) 
[1] 2 

R Language Definition

本款適用於關門,而是不基本功能。後者通常會忽略標籤並進行位置匹配,但應該查閱其幫助頁面以瞭解例外情況,其中包括日誌,輪次,signif,rep和seq.int。

所以你的情況,你最終使用dates的第二個參數來-即使你試圖將其指定爲第一。通過使用「日期」方法-,這不是一個原始的,我們可以得到它的工作。

從技術上講,您所看到的行爲是一項功能,或者可能是「記錄的不一致性」。那些可能認爲是一個錯誤的部分是,R將做多分派到「日期」方法-儘管該方法不支持非日期參數作爲第一個參數:

> 1:4 - dates # dispatches to `-.Date` despite first argument not being date 
Error in `-.Date`(1:4, dates) : can only subtract from "Date" objects 
+0

啊,'lapply'把它的第一個參數放在提供函數的第一個位置。謝謝。 –

1

你可能會更好使用POSIXt日期。例如,如果您想添加一週或一年,它們會更靈活一點。使用lubridate功能等效答案@BrodieG與POSIXt工作:

dates <- ymd(seq(Sys.Date(), Sys.Date()+10, by='day')) 
number.of.days <- 1:4 

list(dates-1, dates-2, dates-3, dates-4) 

lapply(number.of.days, `-.POSIXt`, e1=dates) 

另外,如何在費城的釣魚?:)