Как разделить данные в одной группе по R? - PullRequest
0 голосов

Я пытаюсь подключить ссылку, по которой прошел mac-адрес и которая использует скорость от 4 км / ч до 100 км / ч.
У меня есть фрейм данных Link, Date, Mac address, Time, speed, Status. Статус - это столбец, в котором я проверяю, что «менее 4 км / ч, но более 100 км / ч» - это правда. Я хотел бы разделить поездку каждого MAC-адреса в день. Отключение будет разделено, когда False переключится на True или True переключится на False.

Link    Date      Mac address       Speed        Status
247-237 1/15/2018 00:00:00:00:00:00 25.76649746  False
237-235 1/15/2018 00:00:00:00:00:00 2.26099837   True
235-109 1/15/2018 00:00:00:00:00:00 39.83606557  False
214-106 1/15/2018 00:00:00:00:00:00 1.92997812   True
106-215 1/15/2018 00:00:00:00:00:00 4.22249093   False
215-253 1/15/2018 00:00:00:00:00:00 3.17867903   True
253-245 1/15/2018 00:00:00:00:00:00 1.55383123   True
245-238 1/15/2018 00:00:00:00:00:00 4.63823442   False
238-243 1/15/2018 00:00:00:00:00:00 33.21573948  False
241-233 1/15/2018 00:00:00:00:00:00 12.30440587  False
233-248 1/15/2018 00:00:00:00:00:00 6.95569265   False
248-211 1/15/2018 00:00:00:00:00:00 12.04411765  False
211-108 1/15/2018 00:00:00:00:00:00 9.40500000   False
108-202 1/15/2018 00:00:00:00:00:00 72.00000000  False
202-212 1/15/2018 00:00:00:00:00:00 15.14371257  False
212-239 1/15/2018 00:00:00:00:00:00 7.81390049   False
239-230 1/15/2018 00:00:00:00:00:00 217.96363636 True
230-229 1/15/2018 00:00:00:00:00:00 21.73090909  False
229-252 1/15/2018 00:00:00:00:00:00 7.87826087   False
252-244 1/15/2018 00:00:00:00:00:00 2.77302675   True
244-232 1/15/2018 00:00:00:00:00:00 0.21963016   True

Я группирую данные по дате, Mac-адресу и статусу. Затем я соединяю ссылку, однако, ссылка была соединена, следовательно, False / True для всех в группе.

df <- df %>% arrange(Date,Mac address,Time) %>% group_by(Date,Mac address,Status) %>% summarise(Connect=paste(Link, collapse="_"))  

Тогда результат приходит вот так.

Date      Mac address       Status Link
1/15/2018 00:00:00:00:00:00 False  247-237_235-109_106-215_245-238_238-243_
                                   241-233_233-248_248-211_211-108_108-202_
                                   202-212_212-239_230-229_229-252
1/15/2018 00:00:00:00:00:00 True   237-235_214-106_215-253_253-245_239-230_ 
                                   252-244_244-232

Тем не менее, я ожидаю, что выход подключенного канала в последовательности, в которой переключено False / True.

Date      Mac address       Status Link
1/15/2018 00:00:00:00:00:00 False 247-237
1/15/2018 00:00:00:00:00:00 True  237-235
1/15/2018 00:00:00:00:00:00 False 235-109
1/15/2018 00:00:00:00:00:00 True  214-106
1/15/2018 00:00:00:00:00:00 False 106-215
1/15/2018 00:00:00:00:00:00 True  215-253_253-245
1/15/2018 00:00:00:00:00:00 False 245-238_238-243_241-233_233-248_248-211_
                                  211-108_108-202_202-212_212-239
1/15/2018 00:00:00:00:00:00 True  239-230
1/15/2018 00:00:00:00:00:00 False 230-229_229-252
1/15/2018 00:00:00:00:00:00 True  252-244_244-232

Заранее спасибо

1 Ответ

0 голосов
/ 22 января 2019

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

library(dplyr)
library(tidyr)

df <- df %>%
mutate(Flag = ifelse(Status == lag(Status), 0, 1),
    Flag = ifelse(is.na(Flag), 1, Flag),
    CumSum = cumsum(Flag)) %>%
group_by(Date, `Mac address`, Status, CumSum) %>%
summarize(Out = paste(Link, collapse = "_")) %>%
ungroup() %>%
arrange(CumSum)

df

РЕДАКТИРОВАТЬ: вот вывод, который я получаю, который идентичен тому, что вы сказали, что ожидали. Не уверен, что вы имеете в виду в комментарии об этом до сих пор не

# output
# A tibble: 10 x 5
   Date    `Mac address`   Status CumSum Out                                   
<chr>   <chr>           <lgl>   <dbl> <chr>                                 
 1 1/15/2~ 00:00:00:00:00~ FALSE       1 247-237                               
 2 1/15/2~ 00:00:00:00:00~ TRUE        2 237-235                               
 3 1/15/2~ 00:00:00:00:00~ FALSE       3 235-109                               
 4 1/15/2~ 00:00:00:00:00~ TRUE        4 214-106                               
 5 1/15/2~ 00:00:00:00:00~ FALSE       5 106-215                               
 6 1/15/2~ 00:00:00:00:00~ TRUE        6 215-253_253-245                       
 7 1/15/2~ 00:00:00:00:00~ FALSE       7 245-238_238-243_241-233_233-248_248-2~
 8 1/15/2~ 00:00:00:00:00~ TRUE        8 239-230                               
 9 1/15/2~ 00:00:00:00:00~ FALSE       9 230-229_229-252                       
10 1/15/2~ 00:00:00:00:00~ TRUE       10 252-244_244-232  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...