2012-07-09 86 views
1
> f = function(x) as.Date(as.character(x), format='%Y%m%d') 
> f(20110606) 
[1] "2011-06-06" 
> sapply(20110606, f) 
[1] 15131 

爲什麼2個返回的值不一樣。我需要將這個函數應用於長日期的矢量,但是我沒有用sapply()獲取日期!R:f(x)!= sapply(x,f) - 缺陷或特徵?

+0

記錄在'?sapply'中:「值:...一個原子向量或矩陣或長度與'X'相同的列表'。 Date類不是原子的(原子類型在後面的段落中引用)。這與您無法使用Date向量作爲for循環中的迭代器的原因是一樣的。 – 2012-07-09 20:16:42

回答

7
> lapply(20110606, f) 
[[1]] 
[1] "2011-06-06" 

> unlist(lapply(20110606, f)) 
[1] 15131 

sapply unlists lapply,這樣做unclasses

> unclass(lapply(20110606, f)[[1]]) 
[1] 15131 
> class(lapply(20110606, f)[[1]]) 
[1] "Date" 

爲@Joshua李晶指出,沒有必要使用應用型功能但是利息的日期

d <- 20110606 + 0:10 
do.call("c",lapply(d, f)) 

會一種可能的方式來「排除」日期

+0

我需要獲取一個向量以將其附加到數據框。我該怎麼辦? – user1513008 2012-07-09 20:18:49

+0

用'c'做'do.call'是一個方便的提示。不過,遺憾的是,沒有「unlist」或「sapply」這個並不是不成立的。 – seancarmody 2012-08-05 21:38:55

8

您使用的功能創建f已經被矢量化了。除非您爲冗餘部門工作,否則無需使用sapply

> f <- function(x) as.Date(as.character(x), format='%Y%m%d') 
> d <- 20110606 + 0:10 
> f(d) 
[1] "2011-06-06" "2011-06-07" "2011-06-08" "2011-06-09" 
[5] "2011-06-10" "2011-06-11" "2011-06-12" "2011-06-13" 
[9] "2011-06-14" "2011-06-15" "2011-06-16" 
相關問題