максимальное значение из значений между двумя нулями - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть значения в столбце, и я хотел бы выбрать максимальное значение из ненулевых диапазонов в этом столбце.Диапазон определяется ненулевыми значениями между двумя нулями.Я не уверен, правильно ли это объяснение.Пожалуйста, смотрите пример ниже.Я сделал это превосходно, но мне нужно быть в состоянии сделать это в 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) </p>

out <-c (0,0,0,0,9,0,9,0,9,0,9,0,9,0,0,0,10,10,10,0,0) </p>

bbb <-данные.рамка (внутренняя, внешняя) </p>

Ответы [ 4 ]

0 голосов
/ 05 декабря 2018

Способ сделать это с помощью 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))
0 голосов
/ 05 декабря 2018

Всегда полезно привести пример вашей проблемы, который может быть легко воспроизведен другими пользователями, поэтому снимок экрана не является оптимальным.Вот как вы создадите его в будущем:

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))

Теперь для вашей актуальной проблемы вам сначала нужно создать идентификатор, который идентифицирует полосы ненулевых элементов, разделенных нулями:

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)]

, но я предпочел показать его в отдельных шагах.

0 голосов
/ 05 декабря 2018

Вот способ сделать это итеративно.Вероятно, медленно для больших наборов данных.

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
0 голосов
/ 05 декабря 2018

Вы можете использовать следующий код:

max(matrix[,1])

Просто замените 'matrix' на имя вашего объекта, а 1 на номер столбца, который вы хотите проверить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...