2016-11-16 4 views
0

я это data.frame:Удаление строк из кадра данных

set.seed(1) 
df <- data.frame(id1=LETTERS[sample(26,100,replace = T)],id2=LETTERS[sample(26,100,replace = T)],stringsAsFactors = F) 

и это vector:

vec <- LETTERS[sample(26,10,replace = F)] 

Хочу удалить из df любой строки, которые либо df$id1 или df$id2 не находятся в vec

Существует ли более быстрый способ нахождения индексов строк, удовлетворяющих этому условию, чем t его:

rm.idx <- which(!apply(df,1,function(x) all(x %in% vec))) 
+0

Если у вас есть только эти два элемента, чтобы проверить, 'который (! (ДФ $ id1% в% VEC & ДФ $ id2% в% VEC))' –

ответ

1

Цитирование по столбцам может быть быстрее, чем по строкам. Таким образом, использование lapply в цикле по столбцам, создают list логических vector с с %in%, использовать Reduce с |, чтобы проверить, есть ли какие-либо истинные значения для каждой соответствующей строки и использовать его для подмножества в «DF»

df[Reduce(`|`, lapply(df, `%in%`, vec)),] 

Если нам нужны оба элемента, а затем заменить | с &

df[Reduce(`&`, lapply(df, `%in%`, vec)),] 
1

На самом деле

rm.idx <- unique(which(!(df$id1 %in% vec) | !(df$id2 %in% vec))) 

также быстро.

+0

вам не нужно обертывать его в 'unique'; 'which' даст вам индекс номеров строк, соответствующих условию (которое уникально по дизайну) – Jaap

2

Я использовал dplyr с таким сценарием

df1 <- df %>% filter(!(df$id1 %in% vec)|!(df$id2 %in% vec))