2017-10-04 43 views
2

我對R,一個chron對象和sapply函數有問題。我改變了默認原點:用chron和sapply在R上的可能的錯誤

chron_start <- chron("01/01/2010", "00:30:00",origin.=c(month=1, day=1, year=1900)) 
ch <- chron_start+(0:(365*24-1))/24 

現在,如果我跑:

> sprintf("%s", years(ch[1])) 
[1] "2010" 

但是,如果我有sapply反覆運行它,我得到:

> anios <- sapply(ch, function(x){sprintf("%s", years(x))}) 
> anios[1] 
[1] "2080" 

所以它得到70年提前,這是我的起源(1900年)和默認起源(1970年)之間的差異。

我想問你是否發生這種情況,爲了發送錯誤報告,或者如果有解釋這種行爲,以及如何解決它。

在此先感謝!

P.S .:我的R版本是「R版本3.4.2(2017-09-28)」,運行在GNU/Linux openSUSE Leap 42.2 64位上。 Chron軟件包版本是2.3-45

+0

我在R 3.4.1上得到了這個行爲在Windows 7與Chron 2.3-50。 –

+1

'sapply'(像'lapply')應該作用於'list'對象。如果不是,則調用'as.list'。看到'as.list(ch)'將失去任何關於原點的跡象。所以'年代'將會採用標準的POSIX起源(1970年1月1日)。另外,在你的例子中,你可以簡單地嘗試'sprintf(「%s」,years(ch))' – nicola

+0

實際上我正在做的比這個有點複雜,所以'sprintf(「%s」,years(ch)) '不適合我。我剛剛通過做循環來解決這個問題 –

回答

1

我會嘗試而不是與chron一起使用非默認原點或至少將它們儘可能快地轉換爲默認原點。

這裏我們創建ch0,它代表與ch相同的日期時間,但是具有默認原點。 Chron軟件包具有origin函數(以及origin<-函數)來幫助完成此操作,但不會導出,因此我們必須使用chron:::作爲前綴。

ch0 <- chron(ch, origin = chron::origin(chron(0))) 

# now we get the expected years 
anios <- sapply(ch0, function(x){sprintf("%s", years(x))}) 
head(anios) 
## [1] "2010" "2010" "2010" "2010" "2010" "2010" 

注:爲ch0表達另一種上面會:

format(years(ch0)) 

,沒有我們做的不是sapply:

ch0 <- ch 
chron:::origin(ch0) <- chron:::origin(chron(0)) 

另外,sapply可以替換爲甚至需要ch0所以這個工程:

format(years(ch)) 

更新:作爲克羅恩氏「51年2月3日」(只上傳到CRAN)origin的出口,以便代碼的第一行之上不再需要chron:::

ch0 <- chron(ch, origin = origin(chron(0))) 

更新2:已更新注意。

+0

非常感謝您的建議。我不確定如何將一個chron對象「轉換」爲默認原點。這是有幫助的! –