2

データ フレームを取得して、関数内のパネル データに展開しようとしています。

require(lubridate)
require(plyr)

df <- data.frame(group = seq(1, 10))

f <- function(df, sdate, edate) {
  df <- ddply(df, .(group), transform, year = year(seq(ymd(sdate), ymd(edate), by = "year")))
  return(df)
}

f(df, "1945-1-1", "2013-1-1")

これはエラーをスローします:Error in lapply(list(...), .num_to_date) (from #3) : object 'sdate' not found

とが正しく渡され、関数に正しい型があるようですsdateedate

4

2 に答える 2

3

もう 1 つの方法は、「sdate」と「edate」が表示される環境で呼び出しを作成するためdo.callに a を使用することです。call

f <- function(df, sdate, edate) {
  df <- do.call("ddply",list(df, "group", transform, 
                       year = call("year",x= seq(ymd(sdate), 
                                          to = ymd(edate), by = "year"))))
  return(df)
}

f(df, "1945-1-1", "2013-1-1")
    group year
1       1 1945
2       1 1946
3       1 1947
4       1 1948
5       1 1949
6       1 1950
7       1 1951
8       1 1952

編集

プライヤースタイルのソリューション(よりシンプル)

使用する必要がありますplyr::here

この関数は現在のコンテキストをキャプチャし、特別な評価を行い、ddply が呼び出された環境へのアクセスを必要とする関数で **ply を簡単に使用できるようにします。

f <- function(df, sdate, edate) {
   ddply(df, .(group), plyr::here(transform), 
                             year = year(seq(ymd(sdate), ymd(edate), by = "year")))
}
于 2013-07-06T01:02:45.467 に答える
1

それがスコーピングの問題です。回避策は次のとおりです。

> f <- function(df, sdate, edate) {
+   df <- ddply(df, .(group), 
+               function(x) data.frame(year = year(seq(ymd(sdate), ymd(edate), by = "year"))))
+   return(df)
+ }
> 
> head(f(df, "1945-1-1", "2013-1-1"))
  group year
1     1 1945
2     1 1946
3     1 1947
4     1 1948
5     1 1949
6     1 1950
于 2013-07-06T00:57:30.560 に答える