我有一个类似的数据集:
dat<-data.frame(Plot_ID=c("P_1","P_1","P_2","P_3","P_3"),
Name=c("Spec1","Spec2","Spec3","Spec1","Spec4"),
Number=c(2,3,1,5,2))
Plot_ID是物种被激活的图,名称是物种的名称,数字是该图中找到的数量。我想找出每个物种的总体数量。
我的问题是,当然不是每个物种都在每个地块中都有代表。在这种情况下,Spec2的平均个体数量为每个样本3/3。如果我像这样使用聚合函数:
agg.1<-aggregate(dat$Number, list(dat$Name),mean)
Spec2的个人数量是3,这不是我想要的。而且我并不是真的想要将每个物种添加到每个具有0值的图中,并且它不会出现。
EDID澄清我想要的结果
我想要的结果是这样的:
Name N/plot
Spec1 2.3 #Amount of individuals=7/Amount of plots=3
Spec2 1 #3/3
Spec3 0.3 #1/3
Spec4 0.6 #2/3
答案 0 :(得分:2)
您可以使用dplyr ...
library(dplyr)
# output to dataframe newdf
newdf <- dat %>%
group_by() %>%
mutate(n = n()) %>%
ungroup() %>%
group_by(Name, n) %>%
summarise(total = sum(Number)) %>%
mutate(agg.1 = total / n)
结果:
# A tibble: 4 x 4
# Groups: Name [4]
Name n total agg.1
<fctr> <int> <dbl> <dbl>
1 Spec1 5 7 1.4
2 Spec2 5 3 0.6
3 Spec3 5 1 0.2
4 Spec4 5 2 0.4
如果你想在矢量中得到结果,你可以使用pull
函数(dplyr&gt; = 0.7):
agg1. <- dat %>%
group_by() %>%
mutate(n = n()) %>%
ungroup() %>%
group_by(Name, n) %>%
summarise(total = sum(Number)) %>%
mutate(agg.1 = total / n) %>%
pull(agg.1)