mapply和SIMPLIFY,而不是剥离类

时间:2013-03-27 17:57:39

标签: r

我遇到了使用lapply和mapply返回数据的问题。即mapply / lapply返回列表列表。如果我“简化”调用它会删除类信息。

例如:

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 - 它不应该在此示例中,因为函数返回传入的日期...除此之外,类等似乎点亮了。

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

1 个答案:

答案 0 :(得分:0)

一个选项是do.call()成语:

> 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()返回的列表给出的输入数据来调用mapply()函数。

替代方案,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"