تصنيف أو قطع dataframe من قائمة الفئة مجموعة وتلخيص ذلك مع ddply
سؤال
لدي سؤال حول ddply و فرعية.
لدي dataframe 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)
لذلك يجب مستويين هنا :[0,10) و (10,20]
الخطوة الثانية :
أريد كل المجموعة/الفئة تحدد من قبل اثنين من مستويات في v_cut ...مثل هذا :
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 :
أريد أن أعرف تقلب v_rank على المحور x و الوقت بالنسبة للمحور y ، لكل مجموعة v_cut ، لذلك أنا بحاجة لحساب مين يعني,ماكس,sd على v_rank القيمة مع شيء من هذا القبيل
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 :/
و إذا كان من الممكن أن مجموعة من v_cut مثل بلدي على سبيل المثال في الخطوة 3 ؟
هل هناك إمكانية لجعل نفس الأشياء مع "فرعية" خيار ddply ?
مرة أخرى شكرا جزيلا على مساعدتك كبيرة R المعلم !
تحديث 1 :
لدي إجابة على الذهاب step1 إلى step2 :
df$v_cut <- cut_interval(df$v_perco,n=10)
أنا باستخدام plyr ، ولكن ربما يكون هناك إجابة أفضل في هذه الحالة ؟
الجواب انتقل إلى الخطوة 2 الخطوة 3 ؟
تحديث 2 :
براندون Bertelsen أعطني إجابة جيدة مع ذوبان + المدلى بها ، ولكن الآن (فهم) أنا تريد أن تجعل نفس العملية مع 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))')
ولكن أريد أن يكون v_cut في sumData dataframe, كيف يمكن أن أفعل مع ddply ?هل هناك خيار لجعل هذا ؟ أو الاندماج مع الأولي مدافع 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))
مع ".(v_idn, v_time)" أنت تقول ddply أن لكل تركيبة من v_idn و v_time, تريد أن حساب متوسط v_rank.