R: Возвращает значения в столбцах, когда значение в другом столбце впервые становится отрицательным - PullRequest
0 голосов
/ 11 октября 2018

Для каждого идентификатора я хочу вернуть значение в столбце «расстояние», где значение впервые становится отрицательным.Если значение вообще не становится отрицательным, вернуть значение 99 (или другое случайное число) для этого идентификатора.Пример кадра данных приведен ниже.

df <- data.frame(ID=c(rep(1, 4),rep(2,4),rep(3,4),rep(4,4),rep(5,4)),distance=rep(1:4,5), value=c(1,4,3,-1,2,1,-4,1,3,2,-1,1,-4,3,2,1,2,3,4,5))

> df
   ID distance value
1   1        1     1
2   1        2     4
3   1        3     3
4   1        4    -1
5   2        1     2
6   2        2     1
7   2        3    -4
8   2        4     1
9   3        1     3
10  3        2     2
11  3        3    -1
12  3        4     1
13  4        1    -4
14  4        2     3
15  4        3     2
16  4        4     1
17  5        1     2
18  5        2     3
19  5        3     4
20  5        4     5

Требуемый вывод выглядит следующим образом

> df2
  ID first_negative_distance
1  1                       4
2  2                       3
3  3                       3
4  4                       1
5  5                      99

Я пытался, но не мог понять, как сделать это через dplyr.Любая помощь приветствуется.Фактические данные, над которыми я работаю, имеют тысячи идентификаторов с 30 различными уровнями расстояния для каждого.Имейте в виду, что для любого идентификатора может быть несколько экземпляров отрицательных значений.Мне просто нужен первый.

Редактировать: Попробовал решение, предложенное AntonoisK.

> df%>%group_by(ID)%>%summarise(first_neg_dist=first(distance[value<0]))
  first_neg_dist
1              4

Это результат, который я получаю.Не соответствует тому, что получил Антонуа.Не уверен почему.

1 Ответ

0 голосов
/ 11 октября 2018
library(dplyr)

df %>%
  group_by(ID) %>%
  summarise(first_neg_dist = first(distance[value < 0]))

# # A tibble: 5 x 2
#      ID first_neg_dist
#   <dbl>          <int>
# 1     1              4
# 2     2              3
# 3     3              3
# 4     4              1
# 5     5             NA

Если вы действительно предпочитаете 99 вместо NA, вы можете использовать

summarise(first_neg_dist = coalesce(first(distance[value < 0]), 99L))

.

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