2016-08-24 5 views
0

У меня есть кадр данных R, который содержит множество наблюдений и выглядит как:фильтр R data.frame по нескольким столбцам

df <- data.frame(obs1=c(7.1,8.3,9.8), 
       obs2=c(5.2,8.8,4.1), 
       obs3=c(9.6,8.1,7.7), 
       obs4=c(7.2,8.1,9.4), 
       obs5=c(NA,5.4,9.0), 
       hi1=c(9.6,8.8,9.8), 
       hi2=c(7.2,8.3,9.4)) 

Я упрощена, так как набл выходит obs25. hi1 и hi2 содержат самые высокие и следующие самые высокие значения в каждой строке. Мне нужно получить все строки с obs* > x, но меньше, чем hi1 или hi2. Другими словами, все строки, которые имеют значения выше порогового значения, но не являются двумя самыми высокими значениями. Благодаря!

Извините, что не яснее. Например, если порог установлен на уровне 8 и используется выше dataframe результат был бы строки 2 и 3:

в строке 2, obs3 и obs4 являются> 8, но меньше, чем 2 высокая

в строка 3, obs5> 8, но менее 2 высокая

+0

ли вы имеете в виду все * столбцы *, которые являются ab ove порог, но не самые высокие два значения? –

+0

Каков ожидаемый результат? –

ответ

1

Обратите внимание, что нет строк, отвечающих критериям, кажется, описывают (в данном примере):

df <- data.frame(obs1=c(7.1,8.3,9.8), 
       obs2=c(5.2,8.8,4.1), 
       obs3=c(9.6,8.1,7.7), 
       obs4=c(7.2,8.1,9.4), 
       obs5=c(NA,5.4,9.0), 
       hi1=c(9.6,8.8,9.8), 
       hi2=c(7.2,8.3,9.4)) 

x <- 5 

#rows which have a min value greater than x 
df[which(apply(df[,-c(6:7)], 1, min) > x,),] 

#rows which have a max value less than h2 
df[which(apply(df[,-c(6:7)], 1, max) < df$h12,),] 

#rows which have both 
df[intersect(which(apply(df[,-c(6:7)], 1, min) > x,), which(apply(df[,-c(6:7)], 1, max) < df$h12,)),] 
+0

Хорошие идеи здесь Айдан. Помог мне дать ответ на следующий ответ. –

0

Я хочу исследовать одну возможность здесь, и это найти столбцы, которые сравнительно меньше двух самых высоких столбцов, ea ch по их соответствующему элементу строки и меньше порога, который также является вектором для сравнения элемента за элементом. Ниже пример добавляет несколько замечаний, чтобы мы могли фактически увидеть некоторые результаты приходят через:

df <- data.frame(obs1=c(7.1,8.3,9.8), 
       obs2=c(5.2,8.8,4.1), 
       obs3=c(9.6,8.1,7.7), 
       obs4=c(7.2,8.1,9.4), 
       obs5=c(NA,5.4,9.0), 
       obs6=c(6.6,7.3,8.8), 
       obs7=c(1.1,6.7,9.0), 
       obs8=c(8.8,8.4,9.6), 
       obs9=c(6.0,7.8,8.3), 
       hi1=c(9.6,8.8,9.8), 
       hi2=c(7.2,8.3,9.4)) 

х наш порог, который представляет собой вектор

x <- c(5.0,5.0,5.0) 

теперь применяются на в каждом столбце сравнивается с наименьшим из двух столбцов hi, в сочетании с сравнением с порогом. Логический вектор затем запускается как продукт, так что 1 сообщается только, если все элементы имеют значение ИСТИНА. e - логический вектор столбцов, которые мы хотим показать.

e <- as.logical(sapply(df, function(y) prod(ifelse(y < df$hi2 & y > x,TRUE,FALSE))>0)) 

подмножество нашей ДФ по столбцам

dfnew <- df[,which(e)] 

Так что, если я смотрю на конечный результат:

dfnew 
    obs6 obs9 
1 6.6 6.0 
2 7.3 7.8 
3 8.8 8.3