【问题标题】:How to separate the data in the same "group by" in R?如何在 R 中将同一“分组依据”中的数据分开?
【发布时间】:2019-01-17 14:17:57
【问题描述】:

我正在尝试连接使用 4 km/hr 到 100 km/hr 速度的 mac 地址通过的链接。
我有链接、日期、Mac 地址、时间、速度、状态的数据框。状态是我检查“小于 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 行和第 3 行的日期、Mac 地址和状态有什么区别?
  • 我的假设是把一天内每个mac地址的行程分开。当 False 切换到 True 或 True 切换到 False 时,行程将分开。 True 是速度小于 4 公里/小时和大于 100 公里/小时的条件。所以我上面的预期输出是一天内有 10 次 mac 地址。但是,从最近的输出来看,有 2 次行程与我的假设不符。

标签: r group-by dplyr row tidyr


【解决方案1】:

您需要定义一个开关(我称之为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  

【讨论】:

  • 真的谢谢你。然而,结果是一样的。它们总结了所有的 False 和所有的 True,而不是被每次切换分开。
  • 我添加了我的输出,这与您所说的期望得到的相同。
  • 非常感谢。这是我的错,因为我现在处理了更多的数据,这些数据有很多天和很多 mac 地址。我在命令的第二行添加“group_by(日期,Mac address)”,然后再进行突变。然后结果完美。真的谢谢你!!!
  • 如果我的答案成功 - 请考虑接受它(按答案左侧的复选标记)。非常欢迎你:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 2022-12-20
  • 2011-10-14
  • 2015-08-02
  • 2023-02-24
相关资源
最近更新 更多