错误:`n()`只能在dplyr动词内使用。

15

我正在运行R 4.0.2和dplyr 1.0.2

我试图在srvyr对象的summarize调用中使用n = n()

relduration_by_age_grp <- l %>% 
  filter(ongoing == 0 & ptype == i) %>% 
  select(ego.id, ptype, age.grp, ego.age.grp, duration, ego.wawt) %>%
  mutate(min.age.grp = ifelse(age.grp < ego.age.grp, 
                              age.grp,
                              ego.age.grp)) %>%
  srvyr::as_survey(ids=1, weights=ego.wawt) %>%
  group_by(ptype, min.age.grp) %>%
  summarize(n = n(),
            wtd.median = srvyr::survey_median(duration, na.rm=TRUE),
            wtd.mean = srvyr::survey_mean(duration, na.rm=TRUE), 
            median = srvyr::unweighted(median(duration, na.rm=TRUE)),
            mean = srvyr::unweighted(mean(duration, na.rm=TRUE)))

根据其他问题/答案,我也尝试使用dplyr :: summarize(n = dplyr :: n(),但结果仍然相同错误。问题是在srvyr对象上无法使用dplyr n()吗?在srvyr中似乎没有类似的函数可以在summarize调用中使用。

谢谢!


2
如果您包含一个简单的可复现示例,其中包含可用于测试和验证可能解决方案的样本输入和期望输出,那么我们帮助您会更容易。您能否还分享一下您的sessionInfo(),这样我们就可以看到加载了哪些软件包? - MrFlick
嗨,马蒂娜!好久不见了。 - Ben Bolker
嘿,本,很高兴见到你 :) - Martina Morris
我也发现有时在dplyr之上加载plyr可能会导致n()或group_by无法工作并产生该消息。 - Juan C
4个回答

24

这个错误的原因在于R不确定应该使用哪个summarize函数 (dplyr还是plyr)。

幸运的是,我们可以通过在函数前面指定包名和::来明确告诉R我们想要使用的包。

所以使用 dplyr::summarise()


6
据我所知,与接受几乎任何返回标量的总结函数以及其自身的专用函数(如n())不同,srvyr::summarize仅提供了有限的函数选择:从?srvyr::summarize中看到,对于‘tbl_svy’对象,汇总函数接受几个专用函数,例如 survey_meansurvey_totalsurvey_ratio和其他一些函数。

以下是一个似乎有效的hack方法:计算逆权重的总和(survey_total)。
library(srvyr)
data(api, package="survey")
aa <- (apistrat 
      %>% as_survey_design(strata=stype, weights=pw) 
      %>% group_by(stype) 
)
aa %>% summarize(n=survey_total(1/pw))

这与table(apistrat$stype)相匹配。


谢谢!我发现限制与srvyr有关。这个完美地运作。 - Martina Morris

1
也许是因为您加载了一个名为“operators”的包,它掩盖了dplyr包中的“%>%”操作符。

那不是问题所在,Ben已经解释了真正的原因以及如何修复它。 - Konrad Rudolph

1
使用dplyr::summarise()来运行代码,以计算数据库中数据点的数量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接