クラス範囲のリストでデータフレームを分類またはカットし、DDPlyでそれを要約します
質問
ddplyとサブセットについて質問があります。
私はこのようなデータフレームdfを持っています:
df <- read.table(textConnection(
" id v_idn v_seed v_time v_pop v_rank v_perco
1 15 125648 0 150 1 15
2 17 125648 0 120 2 5
3 18 125648 0 100 3 6
4 52 125648 0 25 4 1
5 17 125648 10 220 1 5
6 15 125648 10 160 2 15
7 18 125648 10 110 3 6
8 52 125648 10 50 4 1
9 56 -11152 0 250 1 17
10 15 -11152 0 180 2 15
11 18 -11152 0 110 3 6
12 22 -11152 0 5 4 14
13 56 -11152 10 250 1 17
14 15 -11152 10 180 2 15
15 22 -11152 10 125 3 14
16 18 -11152 10 120 4 6 "), header=TRUE)
第一歩 :
このようなcut_intervalと等しい間隔のリストがあります:
myinterval <- cut_interval(c(15,5,6,1,17,14), length=10)
だから私はここに2つのレベルを持っています:[0,10)と(10,20
ステップ2 :
私は各グループ/クラスがV_CUTの2つのレベルで定義されたいです...このように:
id v_idn v_seed v_time v_pop v_rank v_perco v_cut
1 15 125648 0 150 1 15 (10,20]
2 17 125648 0 120 2 5 [0,10)
3 18 125648 0 100 3 6 [0,10)
4 52 125648 0 25 4 1 [0,10)
5 17 125648 10 220 1 5 [0,10)
6 15 125648 10 160 2 15 (10,20]
7 18 125648 10 110 3 6 [0,10)
8 52 125648 10 50 4 1 [0,10)
9 56 -11152 0 250 1 17 (10,20]
10 15 -11152 0 180 2 15 (10,20]
11 18 -11152 0 110 3 6 [0,10)
12 22 -11152 0 5 4 14 (10,20]
13 56 -11152 10 250 1 17 (10,20]
14 15 -11152 10 180 2 15 (10,20]
15 22 -11152 10 125 3 14 (10,20]
16 18 -11152 10 120 4 6 [0,10)
ステップ3:
X軸のV_RANKの変動性とY軸の時間、各グループV_CUTの時間を知りたいので、Min、Mean、Max、SDのSDを計算する必要があります。
ddply(df, .(v_cut,v_time), summarize ,mean = mean(v_rank), min = min(v_rank), max = max(v_rank), sd = sd(v_rank))
*結果が欲しかった: *
id v_time MEAN.v_rank ... v_cut
1 0 2.25 (10,20]
2 0 2.42 [0,10)
3 10 2.25 [0,10)
4 10 2.42 (10,20]
私の問題
ステップ1を渡す方法がわかりません - >ステップ2:/
そして、ステップ3の私の例のようにv_cutでグループ化することが可能である場合は?
ddplyの「サブセット」オプションで同じものを作成する可能性はありますか?
もう一度、あなたの助けに感謝しますgreat r guru!
更新1:
ステップ1からステップ2への回答があります:
df$v_cut <- cut_interval(df$v_perco,n=10)
私はPlyrを使用していますが、この場合はおそらくより良い答えがありますか?
ステップ2からステップ3に移動するために答えますか?
更新2:
ブランドン・ベルテルセンは私にメルト +キャストで良い答えを与えてくれますが、今(理解するために)私はPlyrとddplyで同じ操作をしたいです。
id v_idn v_time MEAN.v_rank ... v_cut
1 15 0 2.25 (10,20]
2 15 10 2.45 (10,20]
2 17 0 1.52 [0,10)
2 17 10 2.42 [0,10)
etc.
私はこのようなことで試しています:
r('sumData <- ddply(df, .(v_idn,v_time), summarize,min = min(v_rank),mean = mean(v_rank), max = max(v_rank), sd=sd(v_rank))')
しかし、私はsumdataデータフレームにv_cutを持ちたいですが、ddplyを使用するにはどうすればよいですか?これを作成するオプションはありますか?または、初期dfとkey = v_idnとマージして列v_cutをsumdataに追加することが唯一の良い答えですか?
解決
あなたはこれに本当にplyrを必要としません、あなたは使用することができます reshape
## Pull what you need
dfx <- df[c("v_seed", "v_time","v_rank","v_perco")]
## Bring in your cuts
dfx <- data.frame(dfx, ifelse(df$v_perco > 10,"(10,20]", "[0,10)")))
## Rename v_cut
colnames(dfx)[ncol(dfx)] <- "v_cut"
## Melt it.
dfx <- melt(dfx, id=c("v_cut", "v_seed", "v_time"))
## Cast it.
dfx <- cast(dfx, v_cut + v_time + v_seed ~ variable, c(mean,min,max,sd))
平均だけが必要な場合は、最後の行を次のように置き換えます。
dfx <- cast(dfx, v_cut + v_time + v_seed ~ variable, mean)
「DFX」と入力すると、要求されたものが記載されたデータフレームが表示されます。
他のヒント
構文に問題を抱えているだけです。
## Add your cut
df.new <- data.frame(df, ifelse(df$v_perco > 10,"(10,20]", "[0,10)"))
## Rename v_cut
colnames(df.new)[ncol(df.new)] <- "v_cut"
## Careful here read the note below
df.new <- ddply(df.new, .(v_idn, v_time), function(x) unique(data.frame(
mean = mean(x$v_rank),
v_cut = x$v_cut
)))
または、
ddply(df.new, .(v_idn, v_time), summarise, mean=mean(v_rank))
with "。(v_idn、v_time)" ddplyにv_idnとv_timeの組み合わせごとに、v_rankの平均を計算することを望んでいます。