1

他の質問を閲覧すると、問題はほぼ解決しましたが、最後のハードルで失敗しました...

Rを使用して

plyr パッケージの ddply を使用して関数 (fd) を渡すデータフレーム (d) があります。これは期待どおりにデータフレームを返します。私の実際のデータフレームには、関数を複数回呼び出すのではなく、関数に渡したい多数の変数があります。また、出力データテーブルに関連する col.names を付けたいと思います。以下の作業を段階的に実行しようとしました...

サンプルデータ:

d<-structure(list(date.time = structure(c(1367943040, 1367950947, 
1367950965, 1367950987, 1367951028, 1367951045, 1367959536, 1367960275, 
1367960413, 1367985859, 1368005216, 1368005233, 1368011698, 1368011931, 
1368012615, 1368033855), tzone = "", class = c("POSIXct", "POSIXt"
)), station = c("L5", "L5", "L5", "L5", "L5", "L5", "L7", "L7", 
"L7", "L7", "L5", "L5", "L7", "L7", "L7", "L7"), code = c(10891, 
10891, 10891, 10891, 10891, 10891, 10891, 10891, 10891, 10891, 
10888, 10888, 10888, 10888, 10888, 10888)), .Names = c("date.time", 
"station", "code"), row.names = c(2421L, 2466L, 2467L, 2468L, 
2469L, 2470L, 2472L, 2473L, 2474L, 2812L, 2837L, 2838L, 2859L, 
2860L, 2861L, 3219L), class = "data.frame")

イベントの最初の発生を見つけて、このイベントが発生した日時を返す関数があります。

fd<- function(x, var){
  time<- (as.POSIXct(x$date.time [x$station == var] [1]))
  paste (as.POSIXct (time, origin="1970-1-1", tz='UTC'))
}

これをデータフレームに渡します:

ddply(d,'code',fd,"L7")

ステーション「L7」が最初に記録された日時を検索し、データフレームを返します。

code                  V1
1 10888 2013-05-08 12:14:58
2 10891 2013-05-07 21:45:36

複数の関数呼び出しを記述するよりも、複数の関数引数を呼び出すより効率的な方法はありますか? また、列に名前を付けるには、上記の「V1」は「L7」と読みます(機能しません)...

ddply(d,'code',fd,c("L7", "F5"))   

私がこれまでに持っていて、ある程度機能するのは次のとおりです。

data.frame(  
  ddply(d,'code',fd,"L7"),
  ddply(d,'code',fd,"L5")) 

戻り値:

   code          V1          code.1        V1.1
1 10888 2013-05-08 12:14:58  10888 2013-05-08 10:26:56
2 10891 2013-05-07 21:45:36  10891 2013-05-07 17:10:40

ご覧のとおり、「コード」が繰り返されています

colnames は不適切です。最終的に欲しいのは、data.frame です。

  code           M1                 M2
1 10888 2013-05-08 12:14:58  2013-05-08 10:26:56
2 10891 2013-05-07 21:45:36  2013-05-07 17:10:40
4

2 に答える 2

2

plyrこれを行うにはおそらくもっと簡単な方法がありますが、 の使用をと組み合わせることができますreshape2

require(plyr)
require(reshape2)

d2 <- ddply(d, c("code", "station"), function(df) {
  df[which.min(df$date.time),]
})

d3 <- dcast(d2, code ~ station, value.var = "date.time")

d3

   code         L5         L7
1 10888 1368005216 1368011698
2 10891 1367943040 1367959536

dcastPOSIXct クラスを整数に変換するため、元に戻す必要があります。

d3[,grepl("^L", colnames(d3))] <- lapply(d3[,grepl("^L", colnames(d3))], as.POSIXct,  
  origin="1970-10-01")

d3
   code                  L5                  L7
1 10888 2004-02-06 04:26:56 2004-02-06 06:14:58
2 10891 2004-02-05 11:10:40 2004-02-05 15:45:36

編集

を必要としない簡単な方法を考えましたreshape2

  as.POSIXct(tapply(df$date.time, df$station, min), origin="1970-10-01")
+ })

   code                  L5                  L7
1 10888 2014-02-05 04:26:56 2014-02-05 06:14:58
2 10891 2014-02-04 11:10:40 2014-02-04 15:45:36

これはすべて、出力で各測点の値を異なる列にリストすることを本当に望んでいることを前提としています。ステーション ID が別の列になっていても問題ない場合は、djhurio の応答が最も単純です。

于 2013-06-09T18:39:11.973 に答える
1

ddply(d, c("code", "station"), head, n = 1)

于 2013-06-09T18:44:05.443 に答える