1

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 ずらすことです。この例では、関数が渡された日付を返すため、そうすべきではありません。

そして、私は目がだまされています-私の問題はデータフレームのロードにあります-Gavinのソリューションではありません。

4

1 に答える 1

0

1つのオプションは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"

c()から返されたリストによって与えられた入力データで関数を呼び出すように R を設定し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"
于 2013-03-27T18:07:29.397 に答える