【问题标题】:Count origin-destination relationships (without direct) with R用 R 计算起点-终点关系(没有直接关系)
【发布时间】:2017-03-24 16:28:48
【问题描述】:

我有一个这样的起点-终点表。

library(dplyr)
set.seed(1983)

namevec <- c('Portugal', 'Romania', 'Nigeria', 'Peru', 'Texas', 'New Jersey', 'Colorado', 'Minnesota')

## Create OD pairs
df <- data_frame(origins = sample(namevec, size = 100, replace = TRUE), 
                 destinations = sample(namevec, size = 100, replace = TRUE))

问题

我一直在计算每个起点-终点的关系(没有方向性)。

如何获得将科罗拉多-明尼苏达和明尼苏达-科罗拉多视为一个组的输出?

到目前为止我所做的尝试:

## Counts for each OD-pairs
df %>%
  group_by(origins, destinations) %>%
  summarize(counts = n()) %>%
  ungroup() %>%
  arrange(desc(counts))

Source: local data frame [48 x 3]

      origins destinations counts
        (chr)        (chr)  (int)
1     Nigeria     Colorado      5
2    Colorado     Portugal      4
3  New Jersey    Minnesota      4
4  New Jersey   New Jersey      4
5        Peru      Nigeria      4
6        Peru         Peru      4
7     Romania        Texas      4
8       Texas      Nigeria      4
9   Minnesota    Minnesota      3
10    Nigeria     Portugal      3
..        ...          ...    ...

【问题讨论】:

    标签: r o-d-matrix


    【解决方案1】:

    一种方法是将两个位置的排序组合组合成一个字段。总结一下将删除您的两个原始列,因此您需要将它们重新加入。

    paired <- df %>%
      mutate(
        orderedpair = paste(pmin(origins, destinations), pmax(origins, destinations), sep = "::")
      )
    paired
    # # A tibble: 100 × 3
    #       origins destinations           orderedpair
    #         <chr>        <chr>                 <chr>
    # 1        Peru     Colorado        Colorado::Peru
    # 2     Romania     Portugal     Portugal::Romania
    # 3     Romania     Colorado     Colorado::Romania
    # 4  New Jersey    Minnesota Minnesota::New Jersey
    # 5   Minnesota        Texas      Minnesota::Texas
    # 6     Romania        Texas        Romania::Texas
    # 7        Peru         Peru            Peru::Peru
    # 8     Romania      Nigeria      Nigeria::Romania
    # 9    Portugal    Minnesota   Minnesota::Portugal
    # 10    Nigeria     Colorado     Colorado::Nigeria
    # # ... with 90 more rows
    
    left_join(
      paired,
      group_by(paired, orderedpair) %>% count(),
      by = "orderedpair"
    ) %>%
      select(-orderedpair) %>%
      distinct() %>%
      arrange(desc(n))
    # # A tibble: 48 × 3
    #       origins destinations     n
    #         <chr>        <chr> <int>
    # 1     Romania     Portugal     6
    # 2  New Jersey    Minnesota     6
    # 3    Portugal      Romania     6
    # 4   Minnesota   New Jersey     6
    # 5     Romania        Texas     5
    # 6     Nigeria     Colorado     5
    # 7       Texas      Nigeria     5
    # 8       Texas      Romania     5
    # 9     Nigeria        Texas     5
    # 10       Peru         Peru     4
    # # ... with 38 more rows
    

    (我使用"::"作为分隔符的唯一原因是在不太可能的情况下您需要解析orderedpair;使用默认的" "(空格)将无法与(例如)"New Jersey"一起使用混合。)

    【讨论】:

    • 非常感谢!这正是我想要的:D、pmin 和 pmax 是我错过的关键函数。
    • 它们当然非常方便。我发现自己用这两个函数建模了类似的向量比较函数。 (例如,最近关于 SO 的问题需要pmean 和/或pmedian。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多