Сортировать значения из нескольких столбцов и создать новую переменную - PullRequest
2 голосов
/ 09 января 2020

У меня есть фрейм данных, который выглядит примерно так:

  CityFrom         CityTo   Count
     Paris           Lyon       2
      Lyon          Paris       4
    London     Manchester       5
Manchester         London       6

Я хочу добавить 2 дополнительных столбца в каждую строку, которые будут содержать название города, отсортированное независимо от пункта назначения и источника:

enter image description here

Так, например, Лион-Париж и Париж-Лион в этом случае одинаковы.

Моей первоначальной идеей было:

  1. объединить 2 столбца, т.е. CityFrom и CityTo, используя paste
  2. sort их в алфавитном порядке
  3. split их в 2 столбца.

В качестве варианта использования строка с Парижем как CityFrom и Лионом как CityTo:

  1. paste 2 столбца, чтобы дать - "Париж, Лион" ».

  2. sort для вывода - «Лион, Париж»

  3. split на 2 столбца с Lyon как CityCodeBidirectionalFrom и Paris как CityCodeBidirectionalto.

Мне не удалось реализовать вышеупомянутые логи c.

Ответы [ 4 ]

2 голосов
/ 09 января 2020

На самом деле вам не нужно «сортировать», просто сравните каждую пару. И вам нужно сделать это дважды, щелкнув условие, чтобы получить другое из пары:

library(tidyverse)

d %>% 
  mutate(
    CityCodeBidirectionalFrom = if_else(CityFrom < CityTo, CityFrom, CityTo),
    CityCodeBidirectionalTo = if_else(CityFrom > CityTo, CityFrom, CityTo))

(так как вы не предоставили никаких данных тестирования, мой код - скорее непроверенный псевдокод, чем копирование-вставка решение ...)

1 голос
/ 09 января 2020

Другой вариант - использовать pmin() и pmax().

cbind(df, sapply(c(CityCodeBidirectionalFrom = pmin,
                   CityCodeBidirectionalTo = pmax), do.call, df[1:2]))

    CityFrom     CityTo Count CityCodeBidirectionalFrom CityCodeBidirectionalTo
1      Paris       Lyon     2                      Lyon                   Paris
2       Lyon      Paris     4                      Lyon                   Paris
3     London Manchester     5                    London              Manchester
4 Manchester     London     6                    London              Manchester
1 голос
/ 09 января 2020

Для решения мы можем поместить их в список, отсортировать их, а затем удалить их. Смотрите ниже;

library(dplyr)
library(tidyr)
library(purrr)


df1 %>% 
  mutate(CityCodeBidirectional = map2(CityFrom, CityTo, ~sort(c(.x , .y)))) %>% 
  unnest_wider(data = ., col = CityCodeBidirectional, 
                         names_sep = c("From", "To"), names_repair = "universal")

#> # A tibble: 4 x 5
#>   CityFrom   CityTo     Count CityCodeBidirectionalF~ CityCodeBidirectiona~
#>   <chr>      <chr>      <int> <chr>                   <chr>                
#> 1 Paris      Lyon           2 Lyon                    Paris                
#> 2 Lyon       Paris          4 Lyon                    Paris                
#> 3 London     Manchester     5 London                  Manchester           
#> 4 Manchester London         6 London                  Manchester

Данные:

df1 <- read.table(text="CityFrom    CityTo  Count
                        Paris   Lyon    2
                        Lyon    Paris   4
                        London  Manchester  5
                        Manchester London       6",
                  header = T, stringsAsFactors = F)
0 голосов
/ 09 января 2020

Вы можете сортировать значения без необходимости объединения, например:

df = data.frame(
    CityFrom = c("Paris", "Lyon", "London", "Manchester"),
    CityTo = c("Lyon", "Paris", "Manchester", "London"),
    Count = c(2, 4, 5, 6),
    stringsAsFactors = FALSE
)

mysort = apply(df[,1:2], 1, sort)
rownames(mysort) = c("CityCodeBidirectionalFrom", "CityCodeBidirectionalTo")
cbind(df, t(mysort), stringsAsFactors=FALSE)
##     CityFrom     CityTo Count CityCodeBidirectionalFrom CityCodeBidirectionalTo
## 1      Paris       Lyon     2                      Lyon                   Paris
## 2       Lyon      Paris     4                      Lyon                   Paris
## 3     London Manchester     5                    London              Manchester
## 4 Manchester     London     6                    London              Manchester
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...