2012-07-09 84 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" 
相关问题