首页 > 解决方案 > 通过 3 个条件计算一个变量的 % 突然给出错误消息

问题描述

好的,我的 R 代码中有一个奇怪的问题。我有一个数据集(实际上它更大):

Stomachdata_2017 = data.frame(Species= c('Herring','Herring','Cod','Cod','Cod','Cod','Shark', 'Shark', 'Shark'),
                FishID= c('1', '1', '2', '2', '3','3','4', '5','5'),
                StomachSp= c('Shrimp','Shrimp','Crab', 'Scad', 'Scad', 'Scad','Fish', 'Whiting', 'Fish'))

我想计算每个独特 FishID 每个独特物种的 StomachSp 百分比。我之前做过这个计算(见下文):

#Sum for each unique species, FishID and unique stomach content the amount of prey items
    Stomach_perc <- count(unique(Stomachdata_2017), vars = c("Species", "FishID", "StomachSp"))
    Stomach_perc$Occ <- rep(1,nrow(Stomach_perc))
    Stomach_perc<-with(Stomach_perc,aggregate(Occ,by=list(Species=Species,StomachSp=StomachSp),function(x) sum(x)))
    Stomach_perc$Perc <- with(Stomach_perc, ave(x, Species, FUN=prop.table))
    Stomach_perc$Perc <- Stomach_perc$Perc * 100

但是..当我今天再次运行代码时,它突然给出了一个错误(?!)我以前从未遇到过..我没有更改代码或任何东西。在这个例子中它似乎可以工作,但是当我将此代码应用于我的大型数据集时,它突然停止工作......

Error: Column `vars` must be length 49 (the group size) or one, not 3

谁能帮我?这非常令人沮丧……

谢谢

标签: rpercentage

解决方案


为了详细说明我的评论,问题在于命名空间。

假设您昨天加载了plyr库,然后继续编写以下代码:

Stomach_perc <- count(unique(Stomachdata_2017), vars = c("Species", "FishID", "StomachSp"))

在这种情况下,count指的是包count()导出的函数plyr。在昨天和今天之间的某个时间点,您可能还加载了一些其他包,通常怀疑包括tidyror之类的dplyr。其中一些包也有导出功能count()

今天,当您执行完全相同的代码时:

Stomach_perc <- count(unique(Stomachdata_2017), vars = c("Species", "FishID", "StomachSp"))

这一次,count()可能是从另一个包中导出的函数。

当然,具体问题不在于count():它可能发生在任何具有足够通用名称的函数上。所以使用dplyr::count()明确地使用该包中的计数功能。

顺便说一句,在交互式编写代码时,这是一个非常常见的场景,比如以 R Markdown / R Notebook 格式。您可能会在第 43 行阅读某个库,然后返回并运行第 20 行的代码,然后您会发现,曾经有效的代码不再有效。命名空间!

Hadley Wickham关于这个主题的材料非常值得一读!

希望这可以澄清。


推荐阅读