【问题标题】:R - dplyr, with groupby, combine 2 rows with column vals correct but mixed upR - dplyr,与 group by,将 2 行与列值正确但混淆
【发布时间】:2017-01-29 01:42:52
【问题描述】:

将我正在努力解决的数据操作问题总结为一个标题很困难,但一个简短的示例很好地总结了这一点。我有一个航空公司相关数据的数据表,其中包含出发地和目的地机场的列。我的数据如下所示:

my_data = collect(filter(flightdata, TailNum == t_n) %>%
                select(airport1=Origin,airport2=Dest,ActualElapsedTime) %>% 
                group_by(airport1,airport2) %>%
                summarize(ActualElapsedTime = mean(ActualElapsedTime)))

my_data
     airport1   airport2     ActualElapsedTime
      <chr>    <chr>             <dbl>
1       HNL      ITO          51.67416
2       HNL      KOA          44.00937
3       HNL      LIH          37.98526
4       HNL      OGG          37.52542
5       ITO      HNL          50.02260
6       ITO      OGG          39.22222
7       KOA      HNL          43.52518
8       KOA      OGG          34.20370
9       LIH      HNL          33.47679
10      LIH      OGG          47.06522
11      OGG      HNL          35.28550
12      OGG      ITO          37.57143
13      OGG      KOA          31.61364
14      OGG      LIH          45.46667

这个表是 group_by 的结果,我做了总结,也如上所示。但是,当我进行 groupby 并总结时,我希望它将 (HNL ITO) 和 (ITO HNL) 组合在一起,而不是单独的(第 1 行有(HNL,ITO),第 5 行有(ITO,HNL)) .这些分组行在我的输出中分开的原因是因为 row1 对应于从 HNL 机场到 ITO 机场的航班,而 row5 对应于从 ITO 到 HNL 的航班。然后,我生成的数据框将分为 7 组,而不是 14 组。

对此的任何想法将不胜感激。我只是在学习 dplyr 和 %>% 用于管道,它们很棒,我也想得到这个。

编辑 - 我尝试将我的选择行更改为

select(airport1=pmin(Origin,Dest),airport2=pmax(Origin,Dest),ActualElapsedTime)

但它没有工作......

【问题讨论】:

  • 这看起来像一个类似的问题:stackoverflow.com/questions/28992028/…
  • 会看看谢谢
  • 我没有像那篇文章那样对三个变量的所有组合进行分组。我试图告诉 dplyr “将 HNL ITO 视为与 ITO HNL 相同,即使它们位于不同的列中”。我认为最好的方法是正确设置 airport1 和 airport2,就像我在 select 语句中尝试的那样

标签: r dplyr


【解决方案1】:

一种方法是创建一个新变量,其中包含 airport1airport2 的每一对,然后使用它作为分组变量来汇总数据。

在这种情况下,我们通过按字母顺序粘贴 airport1airport2 的名称来创建一个名为 combination 的变量,因此我们有一个每个配对的唯一值。

my_data <- collect(
  flightdata %>% 
    filter(TailNum == t_n) %>%
    select(airport1 = Origin, airport2 = Dest, ActualElapsedTime) %>% 
    mutate(combination = ifelse(airport1 < airport2, 
                                paste(airport1, airport2),
                                paste(airport2, airport1))
    ) %>% 
    group_by(combination) %>% 
    summarize(ActualElapsedTime = mean(ActualElapsedTime))
  )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2021-12-08
    • 2019-05-13
    • 2017-01-04
    • 2016-02-09
    • 2021-11-07
    相关资源
    最近更新 更多