2013-03-27 47 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