2013-03-05 4 views
0

Я пытаюсь сделать два подмножества моими данными, если какой-либо из 5 столбцов (5-10) содержит множитель в моем списке (keep.list) и тот, где ни один из cols не содержит ничего из keep.list. Вот где я до сих пор, но не могу получить его подмножество справа:Подмножество данных, основанных на том, включены ли какие-либо несколько переменных в список

test.cols <- c(5:10) 
keep.list <- c("dog","cat","mouse","bird") 

data.sub.IN <- data.big[which(any(keep.list %in% data.big[test.cols])),] 

data.sub.NOT.IN <- data.big[which(any(keep.list !%in% data.big[test.cols])),] 

Я думаю which() и any() может помочь, но я мог бы быть неправильно, и я не знаю, как обращаться с «не входит» если обычная команда ! не работает.

+1

Вам не нужно 'which' при использовании' any' или '% in%' для построения индекса. Не то, чтобы у вас был особенно полный пример. Я бы подумал, что 'any' приведет к краху результата к единственному значению, которое не то, что я понимаю, чего вы хотите. –

ответ

3

Вы можете сделать это с помощью apply:

keep <- apply(data.big[test.cols], 1, function(r) any(r %in% keep.list)) 
data.sub.IN <- data.big[keep, ] 
data.sub.NOT.IN <- data.big[!keep, ] 

apply применяет функцию к каждой строке кадра данных. В этом случае для каждой строки он проверяет, находится ли какой-либо из элементов в этой строке в keep.list.

+0

Работает как чемпион. Очень признателен. – km5041

1

Я бы пошел с ответом @ DavidRobinsons, но если вы хотите сохранить его в форме, то вам нужно переместить !. Чтобы отрицать %in%, вы помещаете ! перед первой частью вашего логического оператора.

B <- 1:4 
A <- 3:6 
A %in% B 
[1] TRUE TRUE FALSE FALSE 
!A %in% B 
[1] FALSE FALSE TRUE TRUE 

Так что для вашего случая:

data.sub.NOT.IN <- data.big[which(any(!keep.list %in% data.big[test.cols])),] 

Но, опять же, в этом случае, используя apply это лучший вариант, я думаю.

EDIT на основе @ комментарий Двине, это может не работать (трудно сказать, без примера набора данных), возможно, на самом деле нужно:

data.sub.NOT.IN <- data.big[which(!any(keep.list %in% data.big[test.cols])),] 
+0

Не вернул правильный результат в простой тестовый сценарий, который я построил. Предположим, было бы неплохо, если бы избежать «применения», но в этом случае я думаю, что вы были введены в заблуждение из-за отсутствия понимания OP. –