2011-10-06 33 views
4

我有一個數據框,其中包含70-80行有序響應時間(rt)數據,每個228個人每個都有唯一的ID#(每個人都有沒有相同數量的行)。我想把每個人的RTs分成5個垃圾箱。我希望第一倉是他們最快的20%,第二倉是他們下一個最快的20%RT等等,等等。每個倉都應該有相同數量的試驗(除非試驗的總數是奇數)。如何在R數據框中按每個百分點排序數據[r]

我現在的數據幀是這樣的:

id  RT 
7000 225 
7000 250 
7000 253 
7001 189 
7001 201 
7001 225 

我想我的新數據框,看起來像這樣:

id RT Bin 
7000 225 1 
7000 250 1 

讓我的數據看起來像在此之後,我將通過彙總id和bin

我能想到的唯一方法是將數據拆分成一個列表(使用split命令),循環遍歷每個人,使用分位數命令獲得斷點f或不同倉位,爲每個響應時間分配倉值(1-5)。這感覺非常複雜(對我來說很難)。我遇到了一些困難,如果能夠簡化這一過程,我將不勝感激。謝謝。

回答

4

答案@Chase將範圍分成5組長度相等(端點不同)。你似乎想要的是pentiles(每組5個組數相同)。對於這一點,你需要在Hmisc

library("plyr") 
library("Hmisc") 

dat <- data.frame(id = rep(1:10, each = 10), value = rnorm(100)) 

tmp <- ddply(dat, "id", transform, hists = as.numeric(cut2(value, g = 5))) 

TMP的cut2功能現在有你想要什麼

> tmp 
    id  value hists 
1 1 0.19016791  3 
2 1 0.27795226  4 
3 1 0.74350982  5 
4 1 0.43459571  4 
5 1 -2.72263322  1 
.... 
95 10 -0.10111905  3 
96 10 -0.28251991  2 
97 10 -0.19308950  2 
98 10 0.32827137  4 
99 10 -0.01993215  4 
100 10 -1.04100991  1 

在每個hists相同數量的每個id

> table(tmp$id, tmp$hists) 

    1 2 3 4 5 
    1 2 2 2 2 2 
    2 2 2 2 2 2 
    3 2 2 2 2 2 
    4 2 2 2 2 2 
    5 2 2 2 2 2 
    6 2 2 2 2 2 
    7 2 2 2 2 2 
    8 2 2 2 2 2 
    9 2 2 2 2 2 
    10 2 2 2 2 2 
+0

是的!我是對的,謝謝你的補充。 (如果不清楚,請參閱下面的評論) – Chase

+0

抱歉,@Chase,在我開始撰寫此文章之前,我沒有看到您的評論。 –

+0

不用擔心,它需要一個村莊...... :) – Chase

3

下面是使用包裝plyrcut功能重複的例子:

dat <- data.frame(id = rep(1:10, each = 10), value = rnorm(100)) 

ddply(dat, "id", transform, hists = cut(value, breaks = 5)) 

    id  value    hists 
1 1 -1.82080027  (-1.94,-1.41] 
2 1 0.11035796  (-0.36,0.166] 
3 1 -0.57487134 (-0.886,-0.36] 
4 1 -0.99455189 (-1.41,-0.886] 
.... 
96 10 -0.03376074 (-0.233,0.386] 
97 10 -0.71879488 (-0.853,-0.233] 
98 10 -0.17533570 (-0.233,0.386] 
99 10 -1.07668282 (-1.47,-0.853] 
100 10 -1.45170078 (-1.47,-0.853] 

通行證在labels = FALSEcut,如果你想簡單的整數值返回而不是垃圾箱。

+0

也許我的問題是不清楚,對於每個ID,我希望將相同數量的試驗分成5個分箱。例如,一個有80 rts的人將有16個試驗的5個倉,倉1是最快的16個試驗,倉5是最慢的。你知道一種方法來完成這個嗎? – Matt

+0

@馬特蔡斯的答案正是你所描述的。你甚至嘗試過嗎? – joran

+0

我做到了。我讚賞Chases的解決方案。但我最初的要求並不清楚。我需要每個bin都由相同數量的rts組成。在Chases解決方案中,hist創建了5個bin,但每個都由不同數量的rts組成。 – Matt

0

下面是普通的舊R.

#make up some data 
df <- data.frame(rt = rnorm(60), id = rep(letters[1:3], rep(20))) 

#and this is all there is to it 
df <- df[order(df$id, df$rt),] 
df$bin <- rep(unlist(tapply(df$rt, df$id, quantile)), each = 4) 

答案你會注意到,使用quantile命令可以被設置爲使用任何位數。默認值爲五分位數,但如果您想要十位數,則使用

quantile(x, seq(0, 1, 0.1)) 

以上功能。

上面的答案有點脆弱。它需要相同數量的RT/ID,並且我沒有告訴你如何達到幻數4.但是,它也會在大型數據集上運行得非常快。如果你想在基地R.

library('Hmisc') 
df <- df[order(df$id),] 
df$bin <- unlist(lapply(unique(df$id), function(x) cut2(df$rt[df$id==x], g = 5))) 

一個更強大的解決方案這比第一個解決方案更強大,但它是沒有那麼快。對於小數據集,你不會注意到。

+0

這個彙總命令返回的值是什麼?我想要的是每個id的5個值,第一個值是該id最快的x次試驗的平均值,下一個bin是他們下一個最快的x次試驗。每個垃圾箱應由相同數量的試驗組成(當試驗總次數爲偶數時)。 – Matt

+0

看到應該做你想做的修改 – John

+0

謝謝,約翰。我已經運行了您的修改解決方案我不明白的是爲什麼rts沒有提升。切割點中包含的值的平均值應該隨着切割點變大而增加,否? – Matt