我正在使用ddply函数来计算3次通气管浮潜调查的边界计数。除非我有只在一次通过或在某个站点仅进行一次通过检测到的物种,否则它将起作用。当第二个最大值不可用时,如何在ddply函数中获取“第二”以返回0值而不是NA,因此“有界”计算仍然有效?
Reach<-c("KW-2", rep("MER-1",7))
Pass<-c(1,1,1,2,2,2,3,3)
Species<-c("RBT","BRT","RBT","BRT","RBT", "Unk Trout", "BRT", "RBT")
Count<-c(4,3,26,1,41,1,2,46)
x<-data.frame(Reach, Pass, Species, Count)
x
Reach Pass Species Count
1 KW-2 1 RBT 4
2 MER-1 1 BRT 3
3 MER-1 1 RBT 26
4 MER-1 2 BRT 1
5 MER-1 2 RBT 41
6 MER-1 2 Unk Trout 1
7 MER-1 3 BRT 2
8 MER-1 3 RBT 46
x_BC_reach<-ddply(x, .(Reach, Species), summarize,
first = sort(Count,TRUE)[1],
second = sort(Count, TRUE)[2],
bounded = ((2*first)-second)/2)
x_BC_reach
Reach Species first second bounded
1 KW-2 RBT 4 NA NA
2 MER-1 BRT 3 2 2.0
3 MER-1 RBT 46 41 25.5
4 MER-1 Unk Trout 1 NA NA
答案 0 :(得分:0)
我建议您使用tidyverse
语法来解决所有数据处理任务。假设df
是您的数据框,您可以这样做:
df <- df %>%
group_by(Reach, Species) %>%
summarise(first=sort(Count, TRUE)[1],
second = sort(Count, TRUE)[2],
bounded = ((2*first)-second)/2) %>%
replace_n(list(second=0)
Reach Species first second bounded
1 KW-2 RBT 4 0 0.0
2 MER-1 BRT 3 2 2.0
3 MER-1 RBT 46 41 25.5
4 MER-1 Unk Trout 1 0 0.0
答案 1 :(得分:0)
sort
实际上不是问题,但可以对结果进行子集。
运行second = sort(Count, TRUE)[2]
时,对于KW-2案例,sort
返回4
。
并且4[2]
返回NA
,因为没有第二个元素。因此,在这种情况下,最简单的方法是告诉R它需要附加零个值:
second = c(sort(Count, TRUE), 0)[2]