使用 R 将访问编号分配给数据框中的行

Assigning a visit number to rows in a data frame using R

我在 R 的数据框中处理一个大型的鸟类出现和丰度观察数据库。我们在多年内多次访问了每个调查点,并为我们看到的每只鸟输入了一个鸟类代码行。我们使用年份和儒略日的组合来区分对同一点的访问。我的数据库的简化版本:

pointid year    jul_day alpha   ct
EL_1    2010    112     NESP    3
EL_1    2010    112     RWBL    4
EL_1    2010    112     SALS    5
EL_1    2010    112     VIRA    2
EL_1    2010    119     LALO    6
EL_1    2010    119     RWBL    1
EL_1    2010    119     RWBL    1
EL_1    2010    119     SALS    1
EL_1    2010    119     SALS    5
EL_1    2010    119     TRES    3
EL_1    2011    203     VIRA    2
EL_2    2010    112     GREG    10
EL_2    2010    119     NESP    1
EL_2    2011    203     HAHA    1
EL_2    2012    132     BOBO    2
EL_2    2012    132     LALO    1
EL_2    2012    132     SNEG    4
EL_2    2012    145     YEWA    1
EL_2    2012    167     RNPH    5
EL_2    2013    111     RWBL    8
EL_2    2013    203     SALS    7
EL_3    2010    119     GREG    4
EL_3    2010    196     SALS    12
EL_3    2010    204     LALO    8
EL_3    2010    219     AMAV    1
EL_3    2010    234     BNST    1
EL_3    2014    223     CATE    2

我需要 1) 计算每年每个点 ID 的访问次数,以及 2) 在 2 个新列中为每年的每条记录分配一个访问编号 (1,2,3,4,5) (visit_num, and total_visits_within_year) 附加到数据框。预期输出类似于:

pointid year    jul_day alpha   ct  v   visits_within_year
EL_1    2010    112     NESP    3   1   2
EL_1    2010    112     RWBL    4   1   2
EL_1    2010    112     SALS    5   1   2
EL_1    2010    112     VIRA    2   1   2
EL_1    2010    119     LALO    6   2   2
EL_1    2010    119     RWBL    1   2   2
EL_1    2010    119     RWBL    1   2   2
EL_1    2010    119     SALS    1   2   2
EL_1    2010    119     SALS    5   2   2
EL_1    2010    119     TRES    3   2   2
EL_1    2011    203     VIRA    2   1   1
EL_2    2010    112     GREG    10  1   2
EL_2    2010    119     NESP    1   2   2
EL_2    2011    203     HAHA    1   1   1
EL_2    2012    132     BOBO    2   2   4
EL_2    2012    132     LALO    1   2   4
EL_2    2012    132     SNEG    4   2   4
EL_2    2012    145     YEWA    1   3   4
EL_2    2012    167     RNPH    5   4   4
EL_2    2013    111     RWBL    8   1   2
EL_2    2013    203     SALS    7   2   2
EL_3    2010    119     GREG    4   1   5
EL_3    2010    196     SALS    12  2   5
EL_3    2010    204     LALO    8   3   5
EL_3    2010    219     AMAV    1   4   5
EL_3    2010    234     BNST    1   5   5
EL_3    2014    223     CATE    2   1   1

我刚刚熟悉 reshape2 包,但不知道如何将 melt 或 dcast 应用到这个特定问题。这类似于发布 here 的 sql 问题,但是我需要计算一年内的访问次数并在 R 中分配一年内的访问次数,而不是 sql。非常感谢任何帮助!

对于您的第一个问题,如果您以 data.table 加载,您应该能够:

DT[, sum(count), by=c('pointid', 'year')]

您可以使用 dplyr 包获得想要的结果:

library(dplyr)

d %>% 
  group_by(year,pointid) %>% 
  mutate(v=as.numeric(as.factor(jul_day)), visits_within_year=max(v)) %>%
  print(n=50)

# Source: local data frame [27 x 7]
# Groups: year, pointid
# 
#    pointid year jul_day alpha ct v visits_within_year
# 1     EL_1 2010     112  NESP  3 1                  2
# 2     EL_1 2010     112  RWBL  4 1                  2
# 3     EL_1 2010     112  SALS  5 1                  2
# 4     EL_1 2010     112  VIRA  2 1                  2
# 5     EL_1 2010     119  LALO  6 2                  2
# 6     EL_1 2010     119  RWBL  1 2                  2
# 7     EL_1 2010     119  RWBL  1 2                  2
# 8     EL_1 2010     119  SALS  1 2                  2
# 9     EL_1 2010     119  SALS  5 2                  2
# 10    EL_1 2010     119  TRES  3 2                  2
# 11    EL_1 2011     203  VIRA  2 1                  1
# 12    EL_2 2010     112  GREG 10 1                  2
# 13    EL_2 2010     119  NESP  1 2                  2
# 14    EL_2 2011     203  HAHA  1 1                  1
# 15    EL_2 2012     132  BOBO  2 1                  3
# 16    EL_2 2012     132  LALO  1 1                  3
# 17    EL_2 2012     132  SNEG  4 1                  3
# 18    EL_2 2012     145  YEWA  1 2                  3
# 19    EL_2 2012     167  RNPH  5 3                  3
# 20    EL_2 2013     111  RWBL  8 1                  2
# 21    EL_2 2013     203  SALS  7 2                  2
# 22    EL_3 2010     119  GREG  4 1                  5
# 23    EL_3 2010     196  SALS 12 2                  5
# 24    EL_3 2010     204  LALO  8 3                  5
# 25    EL_3 2010     219  AMAV  1 4                  5
# 26    EL_3 2010     234  BNST  1 5                  5
# 27    EL_3 2014     223  CATE  2 1                  1

如果您想使用基础 R 解决方案,您可以使用:

d2 <- d
d2$v <- ave(d2$jul_day,d2$year,d2$pointid,FUN=as.factor)
d2$visits_within_year <- ave(d2$v,d2$year,d2$pointid,FUN=function(z) if (length(z)==0) NULL else max(z))