两个零之间的最大值

时间:2018-12-05 11:24:15

标签: r range max

我在一列中有值,并希望从该列中的非零范围中选择最大值。范围由两个零之间的非零值定义。我不确定这种解释是否正确。请参见下面的示例。我已经做到了这是excel,但是我需要能够在R中做到这一点,而且我不确定如何去做。任何从何处开始的指南将不胜感激。我的目标是名为“ out”的列。

  

ind <-c(0,0,0,0.4,0.6,0.7,0.7,0.9,0,0,0,1,3,10,0,0)

     

out <-c(0,0,0,0.9,0.9,0.9,0.9,0.9,0,0,0,10,10,10,10,0,0)

     

bbb <-data.frame(ind,out)

4 个答案:

答案 0 :(得分:1)

总是最好提供一个可以由其他用户轻松再现的问题示例,因此屏幕截图并非最佳选择。以下是您将来创建的方法:

library(data.table)
set.seed(1)
dt = data.table(x = sample(0:5, replace = TRUE, prob = c(0.5, rep(0.1,5)), size = 25))

现在针对您的实际问题,您首先需要创建一个ID,该ID标识以零分隔的非零条纹:

dt[, id := rleid(x == 0)]

接下来,您可以计算每个id组的最大值并将其放在新列中:

dt[, max_val := max(x), by = id]

结果如下:

        x    id max_val
 1:     0     1       0
 2:     0     1       0
 3:     2     2       2
 4:     1     2       2
 5:     0     3       0
 6:     5     4       5
 7:     1     4       5
 8:     3     4       5
 9:     3     4       5
10:     0     5       0
11:     0     5       0
12:     0     5       0
13:     3     6       3
14:     0     7       0
15:     4     8       4
16:     0     9       0
17:     4    10       4
18:     1    10       4
19:     0    11       0
20:     4    12       4
21:     1    12       4
22:     0    13       0
23:     3    14       3
24:     0    15       0
25:     0    15       0
        x    id max_val

从技术上讲,您可以同时使用

完成这两个步骤
dt[, max_val2 := max(x), by = rleid(x == 0)]

但我希望将其显示在单独的步骤中。

答案 1 :(得分:0)

您可以使用以下代码:

max(matrix[,1])

只需将'matrix'替换为对象名称,并将1替换为您要测试的列号

答案 2 :(得分:0)

这是一种迭代方式。对于大型数据集来说可能很慢。

m=c(0,0,0,0.1,0.6,0.3,0,0,0.2,0.1,0.2,0,0,0)
maxims=0
aux=NULL
pos=1
for (i in 1:length(m)){

  if (m[i]!=0){
    aux=c(aux,m[i])
  }
  if (m[i]==0 && length(aux)>0){
    maxims[pos]=max(aux)
    aux=NULL
    pos=pos+1
  }
}
> maxims
[1] 0.6 0.2

答案 3 :(得分:0)

使用dplyr的方法:

library(dplyr)

# example of data:
df <- data.frame(x=c(0,0,0,0, 1, 2, 4, 4,0,0,0,0, 2, 34, 23, -1, 0,0,0,0, 43, 23, -11, 4,0, 0, 0))

# create a var "series" that split data by group when finding "first" 0
df <- df %>% mutate(series = cumsum((x != 0 ) &  (lag(x) == 0 )))
# group all 0 values
df$series <- ifelse(df$x == 0, 0, df$series)
# create the var wanted
df<- df %>% group_by(series) %>% mutate(max = max(x))