我正在使用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。非常感谢任何帮助!
答案 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))