Как найти несколько значений условно из вектора? - PullRequest
1 голос
/ 18 июня 2020

У меня есть вектор из нескольких серий возрастающих чисел. Например, у меня здесь 3 серии в векторе v:

v <- c(1,2,3,4,5,
       2,2.5,2.9,3.4,7,
       1,2,7,7.5,8,9) 

Я хотел бы найти позиции первых чисел, которые больше или равны 3 в этой серии. Кроме того, я также хотел бы найти позицию первого числа в каждой серии.

Ожидаемый результат:

# for greater than equal 3
First position: 3 (3)
Second position: 9 (3.4)
Third position 13 (7)

# for the first position
1, 6, 11

Ответы [ 2 ]

3 голосов
/ 18 июня 2020

Создайте переменную для обозначения каждой серии:

inds <- cumsum(c(TRUE, diff(v) < 0))

Найдите позицию первого числа, большего 3 в каждой серии:

as.numeric(tapply(seq_along(v), inds, function(x) x[v[x] >= 3][1]))
#[1]  3  9 13

Найдите позицию первого числа в серия

match(unique(inds), inds)
#[1]  1  6 11
0 голосов
/ 18 июня 2020

База R с использованием позиции:

v_l <- lengths(split(v, cumsum(c(TRUE, diff(v) < 0))))

idx <- cumsum(c(0, v_l[-1])) + sapply(split(v, cumsum(c(TRUE, diff(v) < 0))), 
       function(x){Position(function(y) y >= 3, x)})

cat(paste0(sapply(seq_along(idx), function(i){ 
    paste0(i, ifelse(i == 1, "st", 
                     ifelse(i == 2, "nd", 
                            ifelse(i == 3, "rd", "th"))), 
           " Position: ", idx[i], "(", v[idx[i]], ")")
  }
), collapse = "\n"))
...