Я хочу подмножить data.frame
на основе того, являются ли некоторые переменные положительными, отрицательными или какой-то промежуточной комбинацией. Для n
переменных это должно привести к 2^n
возможным комбинациям.
Я думаю, что combn
можно использовать для достижения этого, но я изо всех сил пытаюсь сделать это правильно.
Образец данных:
library(data.table)
dt <- data.table(x = runif(100, -1, 1), y = runif(100, -1, 1), z = runif(100, -1, 1))
Что я хочу:
dt[x < 0 & y < 0 z < 0, ]
dt[x < 0 & y < 0 z > 0, ]
dt[x < 0 & y > 0 z < 0, ]
dt[x < 0 & y > 0 z > 0, ]
dt[x > 0 & y < 0 z < 0, ]
dt[x > 0 & y < 0 z > 0, ]
dt[x > 0 & y > 0 z < 0, ]
dt[x > 0 & y > 0 z > 0, ]
Что я пробовал до сих пор:
combinator <- function(z){
cnames <- colnames(z)
combinations <- t(combn(c(rep("<", ncol(z)), rep(">", ncol(z))),ncol(z)))
retval <- t(sapply(1:nrow(combinations), function(p){
sapply(1:ncol(z), function(q) paste(cnames[q], combinations[p,q], 0))
}))
return(apply(retval, 1, paste, collapse = " & "))
}
Выход:
> l <- combinator(dt)
> l
[1] "x < 0 & y < 0 & z < 0" "x < 0 & y < 0 & z > 0" "x < 0 & y < 0 & z > 0" "x < 0 & y < 0 & z > 0"
[5] "x < 0 & y < 0 & z > 0" "x < 0 & y < 0 & z > 0" "x < 0 & y < 0 & z > 0" "x < 0 & y > 0 & z > 0"
[9] "x < 0 & y > 0 & z > 0" "x < 0 & y > 0 & z > 0" "x < 0 & y < 0 & z > 0" "x < 0 & y < 0 & z > 0"
[13] "x < 0 & y < 0 & z > 0" "x < 0 & y > 0 & z > 0" "x < 0 & y > 0 & z > 0" "x < 0 & y > 0 & z > 0"
[17] "x < 0 & y > 0 & z > 0" "x < 0 & y > 0 & z > 0" "x < 0 & y > 0 & z > 0" "x > 0 & y > 0 & z > 0"
> l[1]
[1] "x < 0 & y < 0 & z < 0"
> subset(dt, eval(l[1]))
Error in subset.data.table(dt, eval(l[1])) :
'subset' must evaluate to logical
Также, если следующее показывает, что я не перечисляю все желаемые комбинации:
> unique(l)
[1] "x < 0 & y < 0 & z < 0" "x < 0 & y < 0 & z > 0"
[3] "x < 0 & y > 0 & z > 0" "x > 0 & y > 0 & z > 0"
вывод должен иметь 8 уникальных результатов вместо 4, показанных выше.