我正在使用survey
R包中的“svyby”函数,并得到一个我不知道如何处理的错误。
首先,我使用变量 cntry 作为分组,接下来,我使用 essround 作为分组,这一切都很顺利。但是当我使用他们的组合 ~cntry + essround 时,它会返回错误。
我很困惑,它如何分别为每个分组工作,但不适用于组合分组。
这与省略的数据有某种关系,就像当我删除所有空单元格时(即使用 na.omit(dat)而不是 dat 来定义调查设计)它开始工作。但我不想放弃所有的失误。我认为svymean的na.rm论点应该处理它。请注意,变量 cntry 和 essround 不包含任何缺失值。
library("survey")
s.w <- svydesign(ids = ~1, data = dat, weights = dat[,weight])
svyby(~ Security, by=~ essround, s.w, svymean, na.rm=T) # Works
svyby(~ Security, by=~ cntry, s.w, svymean, na.rm=T) # Also works
svyby(~ Security, by=~ essround+cntry, s.w, svymean, na.rm=T) # Gives an error
Error in tapply(1:NROW(x), list(factor(strata)), function(index) { :
arguments must have same length
所以我的问题是 - 如何让它发挥作用?
更新
对不起,我误读了文档。通过向na.rm.all = TRUE
函数添加svyby
来解决该问题。
答案 0 :(得分:0)
请原谅我迟到的答案,但我只是在寻找类似问题的解决方案并立即解决。检查essround
,cntry
和Security
(使用table()
)的交叉列表中是否有空单元格。如果这样做,请尝试使用ordered()
将分组变量转换为有序因子,并在运行levels
之前使用函数的svyby()
参数明确命名您的级别。有序因子将在交叉列表中显示0的频率,而常规因子将丢弃空单元格。
答案 1 :(得分:0)
我不确切知道为什么,但这是我如何解决同样的问题。它似乎与svyby
处理NA
数据的方式有关 - 即使您指定na.rm=T
也是如此。我创建了数据框的子集,发现如果子集小于某个阈值(在我的情况下它是500,但确切的值是确定的)并且包含NA
,它确实会发生 - 适用于其他子集,例如大于10,000,NA
或小于500而不NA
。在您的情况下,应该有essround==x & cntry==y
的子集,该子集很小且Security = NA
。因此,在您执行NA
之前清除数据不要svyby
(可以删除,估算或单独分组 - 这取决于您),然后再次尝试。它对我有用。