使用R为数据框中的行分配访问号

时间:2015-02-11 23:46:19

标签: r reshape2

我正在使用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)中为每年内的每条记录分配一个访问号码(1,2,3,4,5) ,和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包,但无法弄清楚如何将融化或dcast应用于此特定问题。这类似于发布here的sql问题,但是我需要计算年内的访问次数并在R中分配一年内的访问次数,而不是sql。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以使用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))