2016-02-15 2 views
1

У меня есть два dataframesВыберите строки в одном фрейме данных на основе значений столбцов в другом?

df1

i1 i2 i3 
p1 1 1 1 
p2 0 1 1 
p3 0 0 1 

df2

 p1 p2 p3 
site1 0 0 1 
site2 4 1 10 
site3 15 0 0 

Теперь я хочу, чтобы создать список dataframes для каждого сайта в df2. Файловые кадры должны состоять только из строк из df1, которые находятся в df2 и равны> 0.

Для примера новый ДФ в моем списке должен быть следующим:

site1: i1 i2 i3 
     p3 0 0 1 


site2:  i1 i2 i3 
     p1 1 1 1 
     p2 0 1 1 
     p3 0 0 1 

site3:  i1 i2 i3 
     p1 1 1 1 

Помимо проблемы списка, я не могу получить R, чтобы выбрать правильные строки в df1. То, что я сделал до сих пор использует% в%

test<-df1[df1[,1] %in% (df2[1,-1]>0),] 

, который дает мне COLNAMES (DF1) с < 0 строк> (или 0 длины row.names)

Кто-нибудь идея, где я пошло не так? Я не знаю, могу ли я каким-то образом использовать слияние, так как мне нужно проверить правильное кол-во и значение> 0.

ответ

1

Я думаю, что вы должны были which вместо %in%. в Определим функцию с помощью которой, что делает это для какой-либо конкретной строки:

foo = function(x, df1, df2) { 
    df1[which(df2[x, ] > 0), ] 
} 

теперь мы используем apply сделать функцию выше по всем строкам в df2.

apply(matrix(1:nrow(df2)), 1, foo, df1 = df1, df2 = df2) 
+0

Спасибо вам большое, что сработало неплохо. Тем не менее, я сначала получил некоторые странные результаты, и после того, как я просмотрел его, я обнаружил, что столбцы в df2 не отсортированы в алфавитном порядке. Поскольку передается только число, не указанное конкретное colname df2 [x,]> 0, я получил неправильные результаты (который был исправлен после их упорядочивания). Я просто блуждаю, если есть способ обойти эту проблему? В противном случае мне всегда нужно проверить, соответствуют ли имена ростов (df1) и colnames (df2) (или идентичны). Вот почему я начал с оператора% in%, потому что понял, что он смотрит на фактические строки. – eugenego

Смежные вопросы

 Смежные вопросы