2013-12-18 4 views
0

У меня есть кадр данных с тысячами строк и 3 столбцами: значение, эксперимент и соотношение. Значение содержит значения (как положительные, так и отрицательные); эксперимент номер эксперимента (E1, E2 или E3), и соотношение содержит одно из трех членов (X.Y, Y.Z или Z.X).Подмножество данных в R

Мне нужно для каждого из трех отношений извлечь все столбцы для 50 значений, ближайших к 0, учитывая, что это, скорее всего, будет представлять собой смесь положительных и отрицательных значений.

Единственный (наивный) способ, который я могу представить, - подмножество/извлечение данных для каждого отношения, затем сортировка (упорядочение) его на основе значения и подмножество снова, чтобы получить 25 отрицательных значений, наиболее близких к 0 и 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

это потрясающе! я не знал, что «существует» - очень полезно! – 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'] 
Смежные вопросы