R中的数据子集

时间:2013-12-18 17:27:58

标签: r dataframe subset

我有一个包含数千行和3列的数据框:值,实验和比率。值包含值(正面和负面);试验实验编号(E1,E2或E3),比例包含三个术语中的一个(X.Y,Y.Z或Z.X)。

我需要三个比率中的每一个,提取最接近0的50个值的所有列,记住这很可能是正值和负值的混合。

我能想到的唯一(天真)方式是为每个比率子集/提取数据,然后根据值对其进行排序(排序),再次使用子集来获得最接近0和25正值的25个负值最接近0。

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

我的解决方案使用by来订购并且:

by(df, df$RATIO, function(x) x[ order(abs(x$VALUE))[1:50] , ] )

这将返回一个列表,每个元素包含一个子集。

答案 1 :(得分:2)

如果您有多行,则为data.table解决方案:

set.seed(1)
N <- 1e6
library(data.table)
dat <- data.table( value = runif(N,-100,100),
                   experiment = sample(paste0('E',1:3),N,rep=T),
                   ratio= sample(c('X.Y', 'Y.Z','Z.X'),N,rep=T))

dat[,{id <- order(abs(value))[1:50]
      list(value=value[id],
           experiment=experiment[id])
      } ,by='ratio']