Как сделать цикл по нескольким столбцам с помощью функции svyby из пакета опросов? - PullRequest
3 голосов
/ 25 сентября 2019

Я пробовал много способов, но мне не удалось решить проблему.Я нашел здесь , здесь и здесь , но я не смог приспособить их к моей проблеме.

Я хотел бы пройти комбинациюиз двух строковых векторов, где каждый элемент «pop» будет объединен с каждым элементом «территория» и по подмножеству столбца «enroll» через числовой вектор («enroll_lines»).Итак, внутри функции svyby есть три итерации, которые я хочу сделать: две над строковым вектором и одна итерация внутри подмножественного числового вектора.

Мне нужен кадр данных со всеми результирующими комбинациями трех векторов пообъект дизайна «dclus1».

Заранее благодарим за внимание и усилия.

df <- apiclus1
df$pais <- 0
df$pop_tot <- 1

pop <- c("pop_tot", "stype", "awards")
territ <- c("pais","cname", "dname")
enroll_lines = c(355, 455, 555)

dclus1<-svydesign(id=~dnum, weights=~pw, data=df, fpc=~fpc)

svyloop <- function(vv1, vv2, dsgn, xx) {
  svyby( as.formula( paste0( "~" , vv1)) , by = as.formula( paste0( "~" , vv2)) , subset(dsgn, enroll < xx), svytotal , vartype = 'cv')
}
svyloop(pop, territ, dclus1, enroll_lines)
#Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :  contrasts can be applied only to factors with 2 or more levels

sapply(dclus1, svyloop, pop, territ, enroll_lines)
#Even though keeping just columns with two or more leves, the column "enroll" is not found, as the message below returns:
#Error in subset.default(dsgn, enroll < xx) : object 'enroll' not found

**The other way I've tried was to put an "i" of iteration in the function.**
jj <- 1:3
svyloop <- function(vv1, vv2,, xx, i) {
  svyby( as.formula( paste0( "~" , vv1[i])) , by = as.formula( paste0( "~" , vv2[i])) , subset(dclus1, enroll < xx[i]), svytotal , vartype = 'cv')
}
svyloop(pop, territ, enroll_lines, jj)
sapply(dclus1, svyloop, pop, territ, enroll_lines)
#Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :  contrasts can be applied only to factors with 2 or more levels

...