问题描述
我正在学习dplyr,并已从类似的帖子中搜索解决方案,但没有发现这种问题的组合。
这是示例数据帧:
long countByUsername(String username);
我需要返回一个数据框,以计算每种独特物种/类型组合的质量百分比,并且我需要在sampleID中出现物种/类型的百分比频率
因此,本例中葡萄/植物的种类/类型的解决方案是 质量百分比=(5 + 2)/(总和(质量)) 频率百分比为2/3,因为该组合在sample1中没有发生。
首先,我尝试了不同的组合,例如:
set.seed(1)
df <- data.frame(sampleID = c(rep("sample1",2),rep("sample2",3),rep("sample3",4)),species = c("clover","nettle","clover","vine","vine"),type = c("vegetation","seed","vegetation","vegetation"),mass = sample(1:9))
> df
sampleID species type mass
1 sample1 clover vegetation 9
2 sample1 nettle seed 4
3 sample2 clover vegetation 7
4 sample2 nettle vegetation 1
5 sample2 vine vegetation 2
6 sample3 clover seed 6
7 sample3 clover vegetation 3
8 sample3 nettle seed 8
9 sample3 vine vegetation 5
但是葡萄藤/植被的质量为100%?而且我也不知道从那里去获得基于sampleID的百分比频率。
解决方法
不确定我是否正确,但是也许这就是您想要的:
set.seed(1)
df <- data.frame(sampleID = c(rep("sample1",2),rep("sample2",3),rep("sample3",4)),species = c("clover","nettle","clover","vine","vine"),type = c("vegetation","seed","vegetation","vegetation"),mass = sample(1:9))
library(dplyr)
df %>%
# Add total mass
add_count(wt = mass,name = "sum_mass") %>%
# Add total number of samples
add_count(nsamples = n_distinct(sampleID)) %>%
# Add sum_mass and nsamples to group_by
group_by(species,type,sum_mass,nsamples) %>%
summarize(nsample = n_distinct(sampleID),totmass = sum(mass),.groups = "drop") %>%
mutate(percmass = totmass / sum_mass,percfreq = nsample / nsamples)
#> # A tibble: 5 x 8
#> species type sum_mass nsamples nsample totmass percmass percfreq
#> <chr> <chr> <int> <int> <int> <int> <dbl> <dbl>
#> 1 clover seed 45 3 1 6 0.133 0.333
#> 2 clover vegetation 45 3 3 19 0.422 1
#> 3 nettle seed 45 3 2 12 0.267 0.667
#> 4 nettle vegetation 45 3 1 1 0.0222 0.333
#> 5 vine vegetation 45 3 2 7 0.156 0.667