2015-01-29 4 views
2

У меня есть список данных. Мне нужно подмножество DataFrame этого списка в соответствии с критериями в одном столбце блока данных.Подмножество данных в списке по критерию столбца dataframe

(все dataframes из списка имеют одинаковое количество и имена столбцов, и такое же количество строк)

Например, у меня есть:

l <- list(data.frame(x=c(2,3,4,5), y = c(4,4,4,4), z=c(2,3,4,5)), 
data.frame(x=c(1,4,7,3), y = c(7,7,7,7), z=c(2,5,7,8)), 
data.frame(x=c(2,3,1,8), y = c(1,1,1,1), z=c(6,4,1,3))) 

names(l) <- c("MH1", "MH2","MH3") 

выход

$MH1 
    x y z 
1 2 4 2 
2 3 4 3 
3 4 4 4 
4 5 4 5 

$MH2 
x y z 
1 1 7 2 
2 4 7 5 
3 7 7 7 
4 3 7 8 

$MH3 
    x y z 
1 2 1 6 
2 3 1 4 
3 1 1 1 
4 8 1 3 

Итак, я хочу подмножить dataframe, для которого столбец «y» находится ближе всего к данному числу. Например, если я говорю, а = 3, выбранный dataframe должен быть «MH1» (где столбец у = 4)

Если «л» был dataframe я буду делать что-то вроде:

closestDF <- subset(l, abs(l$y - a) == min(abs(l$y - a)) 

Как может Я делаю это со списком dataframes?

+2

как о 'л [[which.min (sapply (л, функция (ДФ) сумма (абс (ДФ $ у - а))))]]' – shadow

+0

ли значение в столбце 'у 'идентичны в кадре данных? –

+1

Вы также можете пропустить циклы и просто привязать их все к одному набору данных (потому что все они имеют одинаковые размеры) и найти значение min, например, используя пакет таблицы данных 'rbindlist (l) [, .SD [abs (y - a) == which.min (abs (y - a))]] –

ответ

2

После ответов и комментарии @David Arenburg, @akrun и @shadow, здесь есть три возможных решения этой проблемы я опубликовал:

Вариант 1)

library(data.table) 
rbindlist(l)[abs(y - a) == min(abs(y - a))] 

Вариант 2) (нужна R версия> 3.1.2)

library(dplyr) 
bind_rows(l) %>% filter(abs(y-a)==which.min(abs(y-a))) 

вариант 3) (также отлично работает, но вычислительно менее быстрее, чем первые 2 варианта, если используются в большом цикле или итерационного про налог)

l[[which.min(sapply(l, function(df) sum(abs(df$y - a))))]] 
Смежные вопросы