0

親愛なる R ユーザー コミュニティへ

次のように、リストに多くの data.frames があります (便宜上、21 のリストの 1 つの data.frame のみを示します)。

> str(datal)
List of 21
 $ BallitoRaw.DAT                :'data.frame': 1083 obs. of  3 variables:
  ..$ Filename: Factor w/ 21 levels "BallitoRaw.DAT",..: 1 1 1 1 1 1 1 1 1 1 ...
  ..$ date    :Class 'Date'  num [1:1083] 7318 7319 7320 7321 7322 ...
  ..$ temp    : num [1:1083] NA 25.8 NA NA NA NA NA NA NA 24.4 ...

リスト内の各 data.frame を個別に処理すると、次のように、temp と date から Zoo オブジェクトを作成できます。

> BallitoRaw.zoo <- zoo(datal$BallitoRaw.DAT$temp, datal$BallitoRaw.DAT$date)

Zoo オブジェクトは次のようになります。

> head(BallitoRaw.zoo)
1990-01-14 1990-01-15 1990-01-16 1990-01-17 1990-01-18 1990-01-19 
        NA       25.8         NA         NA         NA         NA 

llply または apply (または同様のもの) を使用して、リスト全体を一度に操作するにはどうすればよいですか?

出力は、data.frames の新しいリスト、または一連の独立した data.frames (上記の Zoo の例のようにそれぞれに名前が付けられています) に入る必要があります。日付列は、通常の時系列 (日) ですが、欠落している日付が含まれていることに注意してください (既存の日付の一時の NA に加えて)。欠落している日付は、zoo 関数によって埋められます。したがって、zoo オブジェクトを含む出力 data.frame は、元のものよりも長くなります。

よろしくお願いします。

4

2 に答える 2

3
makeNamedZoo <- function(dfrm){ dfrmname <- deparse(substitute(dfrm))
  zooname <-dfrmname
   assign(zooname,   zoo(dfrm$temp, dfrm$date))
   return(get(zooname)) }
ListOfZoos <- lapply(dflist, makeNamedZoo)
names(ListOfZoos) <- paste( sub("DAT$", "", names(dflist) ), "zoo", sep="")

簡単なテストケースを次に示します。

df1 <- data.frame(a= letters[1:10], date=as.Date("2011-01-01")+0:9, temp=rnorm(10) )
df2 <- data.frame(a= letters[1:10], date=as.Date("2011-01-01")+0:9, temp=rnorm(10) )
dflist <- list(dfone.DAT=df1,dftwo.DAT=df2)
ListOfZoos <- lapply(dflist, makeNamedZoo) 
names(ListOfZoos) <- paste( sub("DAT$", "", names(dflist) ), "zoo", sep="")

$dfone.zoo
2011-01-01 2011-01-02 2011-01-03 2011-01-04 2011-01-05 2011-01-06 2011-01-07 
 0.7869056  1.6523928 -1.1131432  1.2261783  1.1843587  0.2673762 -0.4159968 
2011-01-08 2011-01-09 2011-01-10 
-1.2686391 -0.4135859 -1.4916291 

$dftwo.zoo
2011-01-01 2011-01-02 2011-01-03 2011-01-04 2011-01-05 2011-01-06 2011-01-07 
 0.7356612 -0.1263861 -1.6901240 -0.6441732 -1.4675871  2.3006544  1.0263354 
2011-01-08 2011-01-09 2011-01-10 
-0.8577544  0.6079986  0.6625564 
于 2011-09-25T14:50:26.063 に答える
1

これは、私が必要としていたものを達成するためのより簡単な方法です:

tozoo <- function(x) zoo(x$temp, x$date) 
data1.zoo <- do.call(merge, lapply(split(data1, data1$Filename), tozoo))

結果は素晴らしい動物園のオブジェクトです。

于 2012-02-27T13:45:11.733 に答える