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