2013-03-27 25 views
1

我有一个问题,使用lapply和mapply返回数据。即该mapply/lapply返回列表的列表。如果我“简化”这个呼叫,它会去掉班级信息。mapply和SIMPLIFY,而不是剥离类

例如:

library(lubridate) 

addBusDays <- function(d, dd) { 
d 
} 

# start with datframe 
dates <- c(ymd('2013-03-04'), ymd('2013-03-07')) 
my.df <- data.frame(n=c(1,2), d=dates) 

mapply(addBusDays, my.df$d, 1, SIMPLIFY=F) 

回报

[[1]] 
[1] "2013-03-03 19:00:00 EST" 

[[2]] 
[1] "2013-03-06 19:00:00 EST" 

class(mapply(addBusDays, my.df$d, 1, SIMPLIFY=F)[[1]] 
[1] "POSIXct" "POSIXt" 

它看起来像它返回一个列表的列表,这是可行的,但我不艾克的解决方案。允许函数简化POSIX类剥离:

mapply(addBusDays, my.df$d, 1, SIMPLIFY=T) 
class(mapply(addBusDays, my.df$d, 1, SIMPLIFY=T)) 

> mapply(addBusDays, my.df$d, 1, SIMPLIFY=T) 
[1] 1362355200 1362614400 
> class(mapply(addBusDays, my.df$d, 1, SIMPLIFY=T)) 
[1] "numeric" 

这看起来会返回一个列表,但会剥离类信息。任何帮助/想法?

工作工作会有断的加文的建议

library(lubridate) 

addBusDays <- function(d, dd) { 
    d 
} 

# start with datframe 
dates <- c(ymd('2013-03-04'), ymd('2013-03-07')) 
my.df <- data.frame(n=c(1,2), d=dates) 
my.df$d.2 <- as.POSIXct(mapply(addBusDays, my.df$d, 2, SIMPLIFY=T), origin="1970-01-01") 

typeof(my.df$d) 
class(my.df$d) 
mode(my.df$d) 
typeof(my.df$d.2) 
class(my.df$d.2) 
mode(my.df$d.2) 

my.df 

回报

> my.df 
    n     d  d.2 
1 1 2013-03-03 19:00:00 2013-03-04 
2 2 2013-03-06 19:00:00 2013-03-07 

该技术由1移天 - 这不应该作为函数返回的日期已过这个例子。 ..除此之外,班级等似乎是现货。

我的眼睛在愚弄我 - 我的问题是加载数据框 - 而不是加文的解决方案。

+0

'mapply'被返回一个列表,其中的每个组件都是类“POSIXct”的向量,也从类“POSIXt”继承。 – 2013-03-27 18:04:27

+0

仍然不知道如何应用这个函数并返回一个POSIXct类的列表 - 你能够在这个方向上推动我吗? – akaphenom 2013-03-27 18:08:00

+0

您的愿望是我的命令 - 请参阅我的答案,现在已更新。 – 2013-03-27 18:17:21

回答

0

一种选择是do.call()成语:从mapply()返回

> do.call("c", mapply(addBusDays, my.df$d, 1, SIMPLIFY = FALSE)) 
[1] "2013-03-03 18:00:00 CST" "2013-03-06 18:00:00 CST" 

其中我们得到R键安排调用c()功能与列表中给出的输入数据。

的替代,这是最有可能会更快大数据,该do.call成语是:

> as.POSIXlt(mapply(addBusDays, my.df$d, 1), origin = "1970-01-01 00:00.00") 
[1] "2013-03-03 18:00:00 CST" "2013-03-06 18:00:00 CST" 

或多个包裹回"POSIXct"对象

> as.POSIXct(as.POSIXlt(mapply(addBusDays, my.df$d, 1), 
+      origin = "1970-01-01 00:00.00")) 
[1] "2013-03-03 18:00:00 CST" "2013-03-06 18:00:00 CST" 
+0

我正在考虑第二个选项,认为它是kludgy。但这可能是我走的方向,如果我不能得到一个更漂亮的答案 – akaphenom 2013-03-27 18:18:18

+0

第二个选项是没有kludge - 你必须设置R的起源来理解秒的数字是指什么。 – 2013-03-27 18:19:13

+0

感谢您的及时,准确和礼貌的回复。 – akaphenom 2013-03-27 18:36:45