使用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个新列(visit_num和total_visits_winn_eyear)内,为每年内的每个记录分配一个访问编号(1,2,3,4,5)。预期输出类似于:

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

我刚熟悉了重新整形的包装,但不知道如何将熔融或dcast应用于这个特定的问题。这与这里发布的sql问题类似,但我需要计算年内的访问次数,并在R中分配年内的访视次数,而不是sql。非常感谢您的帮助!

使用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))

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

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

最新更新