0

サンプルデータ。SOでコードブロックシステムを使用する方法はまだわかりません。

df <- data.frame(c(1,1,1,2,2,2,3,3,3),c(1990,1991,1992,1990,1991,1992,1990,1991,1992),c(1,2,3,3,2,1,2,1,3))
colnames(df) <- c("id", "year", "value")

これにより、単純な行列が生成されます。

id year value
1 1990 1
1 1991 2
1 1992 3
2 1990 3
2 1991 2
2 1992 1
3 1990 2
3 1991 1
3 1992 3

私は R サブセット化の質問を整理していましたが、それに適用された ddply 関数 {plyr} の 2 番目のステップを理解できませんでした。

ロジック: すべての ID サブグループについて、最も早い時点での最大値 (3) を見つけます。

ここでどの構文を使用するかについて混乱しています。SOを検索すると、ddplyが最良の選択だと思いますが、方法がわかりません。理想的には、出力は UNIQUE ID のベクトルである必要があります (1 つだけが選択され、行全体が取得されるためです。これは R では機能しませんが、思いつくことができる最高の「ロジック」です。

ddply( (ddply(df,id)), year, which.min(value) )

例えば

id year value
1 1992 3
2 1990 3
3 1992 3

3 が使用できない場合は、次に高い値 (2 または 1) を取得する必要があります。何か案は?

4

2 に答える 2

2

ddply分割変数に従って、元の data.frame を data.frames に分割することを理解する必要があります。したがって、引数と戻り値として data.frame を持つ関数が必要です。

library(plyr)
ddply(df,.(id),function(DF) {res <- DF[which.max(DF$value),]
                             res[which.min(res$year),]})

#   id year value
# 1  1 1992     3
# 2  2 1990     3
# 3  3 1992     3
于 2013-07-17T19:43:45.687 に答える
0

私はdata.tableあなたにとって最高のツールだと信じています(速度と構文の両方の理由から):

library(data.table)
dt = data.table(df)

# order by year, and then take the first row for each id that has max 'value'
dt[order(year), .SD[which.max(value)], by = id]
#   id year value
#1:  1 1992     3
#2:  2 1990     3
#3:  3 1992     3

# if you're after speed, this slightly worse syntax is the current way of achieving it
dt[dt[order(year), .I[which.max(value)], by = id]$V1]
于 2013-07-17T19:49:20.283 に答える