在R中,在数据框中按因子水平添加一列比例:

huangapple go评论97阅读模式
英文:

Add a column of proportions by factor level in a data frame in R

问题

我有一个数据框,其中有一个"site"列,一个"species"列,一个"counts"列,以及其他列,我需要创建另一个列,该列根据"species"使用"counts"数据来计算比例。

  1. site <- c(rep("site1",3), rep("site2",4), rep("site3",2))
  2. species <- c("sp1","sp2","sp3","sp1","sp2","sp3","sp4","sp2","sp4")
  3. counts <- c(4,10,22,1,13,23,4,3,1)
  4. data <- cbind(site,species,counts)
  5. # 计算每个物种的比例
  6. data$proportions_by_species <- ave(data$counts, data$species, FUN=function(x) x/sum(x))

所得的数据框应该包含一个额外的列,该列包含根据"species"计算的比例,如下所示:

  1. site species counts proportions_by_species
  2. 1 site1 sp1 4 0.80
  3. 2 site1 sp2 10 0.38
  4. 3 site1 sp3 22 0.49
  5. 4 site2 sp1 1 0.20
  6. 5 site2 sp2 13 0.50
  7. 6 site2 sp3 23 0.51
  8. 7 site2 sp4 4 0.80
  9. 8 site3 sp2 3 0.11
  10. 9 site3 sp4 1 0.20
英文:

I have a data frame with a a "site" column, a "species" column, a "counts" column, plus other columns, and I need to create another column with proportions by "species" using "counts" data.

  1. site &lt;- c(rep(&quot;site1&quot;,3), rep(&quot;site2&quot;,4), rep(&quot;site3&quot;,2))
  2. species &lt;- c(&quot;sp1&quot;,&quot;sp2&quot;,&quot;sp3&quot;,&quot;sp1&quot;,&quot;sp2&quot;,&quot;sp3&quot;,&quot;sp4&quot;,&quot;sp2&quot;,&quot;sp4&quot;)
  3. counts &lt;- c(4,10,22,1,13,23,4,3,1)
  4. data &lt;- cbind(site,species,counts)
  5. site species counts ...
  6. 1 site1 sp1 4
  7. 2 site1 sp2 10
  8. 3 site1 sp3 22
  9. 4 site2 sp1 1
  10. 5 site2 sp2 13
  11. 6 site2 sp3 23
  12. 7 site2 sp4 4
  13. 8 site3 sp2 3
  14. 9 site3 sp4 1

My desired data frame should have and added column with proportions by "species", like this:

  1. site species counts proportions_by_species ...
  2. 1 site1 sp1 4 0.80
  3. 2 site1 sp2 10 0.38
  4. 3 site1 sp3 22 0.49
  5. 4 site2 sp1 1 0.20
  6. 5 site2 sp2 13 0.50
  7. 6 site2 sp3 23 0.51
  8. 7 site2 sp4 4 0.80
  9. 8 site3 sp2 3 0.11
  10. 9 site3 sp4 1 0.20

答案1

得分: 1

  1. library(dplyr)
  2. site <- c(rep("site1", 3), rep("site2", 4), rep("site3", 2))
  3. species <- c("sp1", "sp2", "sp3", "sp1", "sp2", "sp3", "sp4", "sp2", "sp4")
  4. counts <- c(4, 10, 22, 1, 13, 23, 4, 3, 1)
  5. data <- data.frame(site, species, counts)
  6. data <- data %>%
  7. group_by(species) %>%
  8. mutate(proportions_by_species = prop.table(counts))

或者

  1. data <- data %>%
  2. group_by(species) %>%
  3. mutate(proportions_by_species = counts/sum(counts))
英文:
  1. library(dplyr)
  2. site &lt;- c(rep(&quot;site1&quot;,3), rep(&quot;site2&quot;,4), rep(&quot;site3&quot;,2))
  3. species &lt;- c(&quot;sp1&quot;,&quot;sp2&quot;,&quot;sp3&quot;,&quot;sp1&quot;,&quot;sp2&quot;,&quot;sp3&quot;,&quot;sp4&quot;,&quot;sp2&quot;,&quot;sp4&quot;)
  4. counts &lt;- c(4,10,22,1,13,23,4,3,1)
  5. data &lt;- data.frame(site,species,counts)
  6. data &lt;- data |&gt;
  7. group_by(species) |&gt;
  8. mutate(proportions_by_species = prop.table(counts))

Alternatively

  1. data &lt;- data |&gt;
  2. group_by(species) |&gt;
  3. mutate(proportions_by_species = counts/sum(counts))

huangapple
  • 本文由 发表于 2023年7月17日 19:30:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/76704018.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定