2015-10-23 2 views
0

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

cond <- list(list(1), list(1, 2), list(1, 2, 3)) 

На основании этого cond списка Я хочу сделать Подменю. В тривиальном жестко закодированном случае, я делаю это так:

t1 <- subset(dat, group == 1) 
t2 <- subset(dat, group == 1 | group == 2) 
# etc 

Теперь я хочу, чтобы перейти от этого жестких кодированных решений динамического. В псевдокоде это будет выглядеть так:

ts <- list() 
i <- 1 
for(lst in cond){ 
    ts[i] <- subset(dat, group in lst) # <- This is what I want 
    i <- i + 1 
} 

Другими словами, я хочу, чтобы перейти от этого:

group == 1 | group == 2  

к этому:

group in lst 

Но я не знаю, как это реализовать.

+4

Вам просто нужен оператор '% in%'. – joran

+0

@joran. Благодаря! Я проверю это через минуту. – Jacobian

+0

Возможный дубликат: http://stackoverflow.com/questions/29188063/how-to-create-a-vector-indicating-matches-between-the-elements-of-one-vector-and – MrFlick

ответ

3

Здесь нет списков списков. Список векторов как

gs <- list(1, 1:2, 1:3) 

должен работать нормально, а затем

ts <- lapply(gs, function(x) dat[dat$group %in% x, ]) 

Я не использую subset в свете этой записки от ?subset:

Это удобная функция предназначенный для интерактивного использования. Для программирования лучше использовать стандартные функции подмножества, такие как [, и, в частности, нестандартная оценка подмножества аргументов может иметь непредвиденные последствия.

+1

'subset()' будет в этом случае должно быть хорошо: 'subset (dat, group% in% lst)'. Проблема в том, что только люди пытаются указать столбцы через переменные. – MrFlick

+0

@MrFlick Лучше всего отключить его использование до того, как OP доберется до этого :) – Frank

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