有没有办法让排序函数在不存在值的情况下返回0而不是NA?

时间:2018-12-20 17:50:36

标签: r sorting

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

2 个答案:

答案 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]