2010-07-30 41 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

相关问题