【问题标题】:Count number of occurrence with a 'class' condition使用“类”条件计算出现次数
【发布时间】:2015-07-23 06:54:03
【问题描述】:

我正在尝试计算“类”高度中物种出现的次数(沿高度梯度分布)。

这是原始数据框:

tab
    R sp N Hauteur Alt Plot Quadrat Microhab Cover
1  R2  B 1  0-50cm 350   P1      Q1       TA    50
2  R2  D 1  0-50cm 350   P1      Q1       TA    50
3  R3  A 2  0-50cm 550   P1      Q1       TA    95
4  R3  C 1  0-50cm 550   P1      Q1       TA    95
5  R3  B 3  0-50cm 550   P1      Q1       TA    95
6  R3  D 4  0-50cm 550   P1      Q1       TA    95
7  R4  C 3  0.5-1m 350   P1      Q1       TB    50
8  R4  A 4  0.5-1m 350   P1      Q1       TB    50
9  R4  E 2  0.5-1m 350   P1      Q1       TB    50
10 R4  D 3  0.5-1m 350   P1      Q1       TB    50
11 R4  B 4  0.5-1m 350   P1      Q1       TB    50

这是我想要得到的:

head(parametres)
SP        Altmin  Altmax   Altmoy  nb_350.549 nb_550.749 [...]   %_350.549m
A          350     550      450        1          0       ...         50
B          350     550      416.67     2          1       ...         33.3
C          350     550      450        1          0       ...         50

为此,我设法获得了前 4 列(“SP”、“Altmin”、“Altmax”、“Altmoy”)。但我无法通过“海拔等级”(例如“nb_350.549”)获得出现次数,也无法获得每个海拔等级在所有人中的代表性百分比,关于每个物种的出现次数(例如“ %_350.549) - 实际上是 = nb.occ.SP(A) / nb_350.549 *100

这是我的脚本:

parametres<-ddply(tab,.(sp),function(esp){
+     summarise(esp,
+               Altmin=min(Alt),
+               Altmax=max(Alt),
+               Altmoy=mean(Alt),
+   )})

有什么想法吗?

谢谢!

R.

【问题讨论】:

  • 原始数据集中的每个 Alt 值都有 350 作为值。为什么第一行报告 800 为Altmin?我猜示例数据是错误的。请提供一些更“现实”的东西,以便每个人都可以检查预期的结果。
  • 您好,已修改!当然最好是这样!感谢您的建议!
  • 以下是一些关于如何根据可重现示例进行思考的提示:stackoverflow.com/questions/5963269/…

标签: r class conditional-statements find-occurrences


【解决方案1】:

这是dplyr 解决方案

tab <- read.table(text="R sp N Hauteur Alt Plot Quadrat Microhab Cover
R2  B 1  0-50cm 350   P1      Q1       TA    50
R2  D 1  0-50cm 350   P1      Q1       TA    50
R3  A 2  0-50cm 550   P1      Q1       TA    95
R3  C 1  0-50cm 550   P1      Q1       TA    95
R3  B 3  0-50cm 550   P1      Q1       TA    95
R3  D 4  0-50cm 550   P1      Q1       TA    95
R4  C 3  0.5-1m 350   P1      Q1       TB    50
R4  A 4  0.5-1m 350   P1      Q1       TB    50
R4  E 2  0.5-1m 350   P1      Q1       TB    50
R4  D 3  0.5-1m 350   P1      Q1       TB    50
R4  B 4  0.5-1m 350   P1      Q1       TB    50",head=TRUE)

library(dplyr)

tab %>% group_by(sp) %>%
  summarize(n=n(),
            Altmin=min(Alt),
            Altmax=max(Alt),
            Altmoy=mean(Alt),
            nb_350.549=sum(ifelse(Alt >= 350 & Alt < 550,1,0)),
            nb_550.749=sum(ifelse(Alt >= 550 & Alt < 749,1,0))) %>%
  mutate(f_350.549=nb_350.549/n*100,
         f_550.749=nb_550.749/n*100)

Source: local data frame [5 x 9]

  sp n Altmin Altmax   Altmoy nb_350.549 nb_550.749 f_350.549 f_550.749
1  A 2    350    550 450.0000          1          1  50.00000  50.00000
2  B 3    350    550 416.6667          2          1  66.66667  33.33333
3  C 2    350    550 450.0000          1          1  50.00000  50.00000
4  D 3    350    550 416.6667          2          1  66.66667  33.33333
5  E 1    350    350 350.0000          1          0 100.00000   0.00000

【讨论】:

  • @RémyPoncet 一定要使用library(dplyr),这个函数是包括在内的(虽然它最初来自library(magrittr)。我不确定相同的代码是否适用于ddply
  • (回复您现在已删除的评论)
  • 是的,我已经删除了它,因为您的建议实际上有效;) - 但是当我用 ddply 尝试它时它没有。非常感谢!
猜你喜欢
  • 2020-09-29
  • 2022-01-14
  • 2021-03-02
  • 2012-01-10
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
相关资源
最近更新 更多