我有一个包含数千行和3列的数据框:值,实验和比率。值包含值(正面和负面);试验实验编号(E1,E2或E3),比例包含三个术语中的一个(X.Y,Y.Z或Z.X)。
我需要三个比率中的每一个,提取最接近0的50个值的所有列,记住这很可能是正值和负值的混合。
我能想到的唯一(天真)方式是为每个比率子集/提取数据,然后根据值对其进行排序(排序),再次使用子集来获得最接近0和25正值的25个负值最接近0。
有更好的方法吗?
答案 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']