Удалить строки в кадре данных, которые не являются последовательными - PullRequest
0 голосов
/ 11 декабря 2019

Мой вопрос связан с другим моим вопросом , но это не совсем то же самое.

Предположим, у меня есть это:

DOY  <-c (1:30) # Day of Year
rain <-c (0,0,0,0,0,0,10,0,0,20,10,5,0,0,0,0,0,0,0,5,20,45,5,2,0,0,0,10,0,0)
DF <- data.frame(DOY=DOY, rain=rain)
# Just interested in days with rain
DF <- DF[DF$rain > 0,] 
# assign ID for each rainfall event, but only if Difference in days is >4
DF$ID <-c (1,1+cumsum(diff(DF$DOY) > 4)) 

# Rerranging, so I have the highest value at top for each group
DF <- DF %>%
  group_by(ID) %>%
  arrange(desc(rain),.by_group=TRUE) 

Мой DF выглядит такthis:

DOY rain    ID
10    20     1
 7    10     1
11    10     1
 9     9     1
12     5     1
22    45     2
21    20     2
28    10     2
20     5     2
23     5     2
24     2     2

Но нужны только дни, которые являются последовательными от дня максимального значения. Мой ожидаемый результат должен быть таким:

DOY rain    ID
10    20     1
11    10     1
 9     9     1
12     5     1
22    45     2
21    20     2
20     5     2
23     5     2
24     2     2

Строки с DOY = 7 и DOY 28 должны быть удалены в моем случае, все остальные DOY сохраняются.

1 Ответ

1 голос
/ 11 декабря 2019

Я думаю, что вы можете повторно использовать ответ на ваш другой вопрос здесь (что было довольно изящным трюком).

DF %>%
  group_by(ID) %>%
  arrange(DOY,.by_group=TRUE) %>%
  mutate(
    max_rain = max(rain),
    i=cumsum(c(TRUE,diff(DOY)>1))
  ) %>%
  group_by(i, ID) %>%
  filter(any(rain==max_rain))

В принципе, для каждого идентификатора вы сохраняете максимальный дождь и создаете другой порядокидентификатор группы (i здесь). Вы должны договориться по DOY, чтобы это работало.

Затем вам просто нужно сгруппировать по идентификатору и отфильтровать все группы, которые не содержат максимальное значение дождя.

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