Ошибка, которую вы получаете: 'subset' must be logical
, что означает, что subset
не знает, что делать с call
объектами, созданными bquote
. Помещение G[[i]]
в eval
должно заставить работать:
dat <- data.frame(time = c(1,3,2,4), prof = c(2,1,1,2))
data <- dat; mod <- substitute(prof == 1)
foo <- function(data, mod){
tim <- sort(unique(data$time))
s <- substitute(mod)
G <- lapply(tim, function(x) bquote(.(s) & time == .(x)))
lapply(1:length(G), function(i) subset(data, eval(G[[i]]))) # <- Use `eval`
}
foo(dat, prof == 1)
Вывод:
[[1]]
[1] time prof
<0 Zeilen> (oder row.names mit Länge 0)
[[2]]
time prof
3 2 1
[[3]]
time prof
2 3 1
[[4]]
[1] time prof
<0 Zeilen> (oder row.names mit Länge 0)
<0 Zeilen> (oder row.names mit Länge 0)
просто говорит, что есть 0 строк. Просто установите поднабор выходного списка, чтобы получить нужные вам фреймы данных.
Я также должен отметить, что ваша функция в основном делает то же самое, что и dat[dat$prof == 1,]
, поскольку вы сравниваете prof
для каждого значения time
(он возвращает фрейм данных, а не список, но это довольно незначительная деталь). Я не уверен, что вы запланировали, но я подумал, что должен упомянуть об этом.