好的,我的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
谁能帮我?这非常令人沮丧......
谢谢
要详细说明我的评论,问题在于命名空间。
考虑您昨天加载了plyr
库,然后继续编写以下代码:
Stomach_perc <- count(unique(Stomachdata_2017), vars = c("Species", "FishID", "StomachSp"))
在这种情况下,count
指的是count()
包导出的plyr
函数。在昨天和今天之间的某个时刻,你可能还加载了一些其他包,通常的嫌疑人包括tidyr
或dplyr
。其中一些包也导出函数count()
。
今天,当您执行完全相同的代码时:
Stomach_perc <- count(unique(Stomachdata_2017), vars = c("Species", "FishID", "StomachSp"))
这次,count()
可以是从另一个包中导出的函数。
具体问题当然不是count()
:它可能发生在具有足够常见名称的任何函数上。因此,使用dplyr::count()
显式使用该包中的count函数。
顺便说一句,这是以交互方式编写代码时非常常见的情况,例如R Markdown / R Notebook格式。您可以在第43行的某个库中阅读,返回并在第20行运行代码并且看,曾经工作的代码不再有效。命名空间!
Hadley Wickham的material on this topic读起来很棒!
希望这澄清一下。