2010-07-30 93 views
0

我有一個很大的data.frame,我希望能夠通過一個變量使用分位數子集來減少它。例如:在一個data.frame中創建多個子集(可能帶有ddply)

x <- c(1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10) 
df <- data.frame(x,rnorm(100)) 

df2 <- subset(df, df$x == 1) 
df3 <- subset(df2, df2[2] > quantile(df2$rnorm.100.,0.8)) 

我想直到結束是一個包含X = 1,2,3,...,10位數的所有一個data.frame。

有沒有辦法用ddply做到這一點?

+4

保存您的按鍵:'x < - rep(1:10,10)' – aL3xa 2010-07-31 01:35:03

回答

3

你可以嘗試:

ddply(df, .(x), subset, rnorm.100. > quantile(rnorm.100., 0.8)) 

而且題外話:你可以使用df <- data.frame(x,y=rnorm(100))命名上即時的列。

+0

感謝Marek,回答以及關於指定動態名稱的提示 - 雖然沒有提出要求,但我想知道如何做! – 2010-07-30 23:36:33

2

下面是使用ave()命令的一個不同方法。 (非常快的計算這樣)

使包含跨X

df$quantByX <- ave(df$rnorm.100., df$x, FUN = function (x) quantile(x,0.8)) 

的每一級分位數計算選擇新柱和X列項的新列。

df2 <- unique(df[,c(1,3)]) 

結果是具有在x列中的唯一項目和爲x的每個電平所計算出的位數一個數據幀。

+0

'ave'是最強大的R功能之一。但在這種情況下,我認爲你應該這樣使用它:'子集(df,rnorm.100。> ave(rnorm.100。,x,FUN = function(v)quantile(v,0.8)))' – Marek 2010-07-30 14:40:24

+0

爲我澄清這個問題... :) – John 2010-07-30 15:16:46

+0

我沒有機會嘗試此功能。上面的Marek解決方案對我的目的很有效。但是,也要感謝你,我會研究「大道」。 – 2010-07-30 22:07:26

相關問題