У меня есть набор данных, аналогичный приведенному ниже примеру, сложные образцы данных. Благодаря пользователю SO IRTFM я смог адаптировать код и сохранить результаты (меня интересуют только общие пропорции, а не доверительные интервалы) в виде измененного объекта для дальнейшей обработки. Что я хотел бы сделать, так это расширить это приложение, чтобы генерировать результаты для 20 других переменных. В идеале я хотел бы сохранить результаты в виде фреймов данных в списке, так как считаю, что это наиболее эффективный способ. Моя проблема заключается в том, как расширить sapply, чтобы я мог обрабатывать несколько переменных одновременно. Я подумал о цикле for по списку, который содержит имена переменных, и начал создавать этот список, var_list ниже, но, похоже, это не путь вперед. Я бы предпочел воспользоваться семейством apply, так как хотел бы, чтобы результаты сохранялись в списке.
library(survey) # using the `dclus1` object that is standard in the examples.
library(reshape)
library(tidyverse)
data(api)
stype_t <- sapply( levels(dclus1$variables$stype),
function(x){
form <- as.formula( substitute( ~I(stype %in% x), list(x=x)))
z <- svyciprop(form, dclus1, method = "me", df=degf(dclus1))
c( z, c(attr(z,"ci")) )} ) %>%
as.data.frame() %>% slice(1) %>% reshape::melt() %>% dplyr::mutate(value = round(value, digits = 4)*100)
Допустим, вы захотели повторить вышеописанное, используя переменные награды. Вы можете скопировать строки и сделать это таким образом, но это будет более эффективно. Итак, я начал с составления списка имен двух переменных в этом примере данных, но я не понимаю, как применить этот список к приведенному выше коду и сохранить результаты в списке фреймов данных. Я пытался обернуть саппли лаппли, но это не сработало, потому что держу пари, что это было неправильно. Любые советы или мысли будут оценены.
var_list <- list("stype", "awards")
Вместо $
для ссылки на именованные элементы рассмотрите [[
экстрактор для ссылки на имена по строке. Кроме того, расширьте substitute
для динамической переменной:
# DEFINED METHOD
df_build <- function(var) {
sapply(levels(dclus1$variables[[var]]), function(x) {
form <- as.formula(substitute(~I(var %in% x),
list(var=as.name(var), x=x)))
z <- svyciprop(form, dclus1, method = "me", df=degf(dclus1))
c(z, c(attr(z,"ci")))
}) %>%
as.data.frame() %>%
slice(1) %>%
reshape::melt() %>%
dplyr::mutate(value = round(value, digits = 4)*100)
}
# ITERATE THROUGH CHARACTER VECTOR AND CALL METHOD
var_list <- list("stype", "awards")
df_list <- lapply(var_list, df_build)
Рад помочь. Да, экстрактор — полезный базовый метод для векторов, матриц, списков, фреймов данных и т. д. Обычно пользователи изучают его раньше $
. Счастливых праздников, @Maggie, и удачного программирования!
Спасибо за этот ответ, он работает. Я не знал о функциональности экстрактора [[.