2013-12-18 186 views
0

我有一個包含數千行和3列的數據框:值,實驗和比率。值包含值(正值和負值);試驗實驗編號(E1,E2或E3),比例包含三個項(X.Y,Y.Z或Z.X)中的一個。R中的數據子集

我需要爲這三個比率中的每一個提取最接近0的50個值的所有列,同時銘記這很可能是正值和負值的混合。

我能想到的唯一(天真的)方式是爲每個比率子集/提取數據,然後根據數值對數據進行排序(排序),然後再次選擇子集以獲得最接近0和25的25個負值值最接近0.

有沒有更好的方法?

+4

提供一個可重複的例子,你已經嘗試過什麼。 – stanekam

+1

只需按絕對值排序以獲得最接近0的值:對應於最小50個絕對值的行。 –

+1

你的天真的方式不符合既定的目標。 50個「最接近」的數值在理論上可能都大於0. –

回答

3

我的解決方案使用由訂購和:

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

這將返回一個列表,包含一個子集的每個元素。

+0

這是fab-ta非常!我不知道「通過」存在 - 非常有用! – Kvothe

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']