Переупорядочить данные с начальным и конечным столбцами в непрерывной последовательности - PullRequest
1 голос
/ 18 июня 2019

У меня есть фрейм данных, где у каждой строки есть идентификатор начала и конца:

df <- data.frame(start_id = c("130", "100", "150", "120"),
                 end_id = c("150", "180", "100", "130"))

#   start_id end_id
# 1      130    150
# 2      100    180
# 3      150    100
# 4      120    130

Я хочу отсортировать данные так, чтобы 'end_id' в одной строке стал 'start_id' следующей строки; идентификаторы начала и конца должны «соединяться», образуя непрерывную цепочку. Простое визуальное представление:

120 -> 130                       
       130 -> 150                
              150 -> 100
                     100 -> 180

Требуемые переупорядоченные данные:

#   start_id end_id
# 4      120    130
# 1      130    150
# 3      150    100
# 2      100    180

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Преобразование вашего фрейма данных в график.Используйте get_diameter, чтобы получить индексы вершин самого длинного пути.Используйте индексы для упорядочения исходных данных.

library(igraph)
g <- graph_from_data_frame(df)
df[head(get_diameter(g), -1), ]
#   start_id end_id
# 4      120    130
# 1      130    150
# 3      150    100
# 2      100    180

Или используйте простой цикл:

# create a vector of row indices 
# get the first start ID, pre-allocate the remaining indices with NA 
ix <- c(which(!df$start_id %in% df$end_id), rep(NA, nrow(df) - 1))

# for each row, check if end ID in one row matches start ID in the next row
for(i in 2:nrow(df)){
  ix[i] <- match(df$end_id[ix[i - 1]], df$start_id)
}

# reorder data
df[ix, ]

get_diameter(g)
# + 5/5 vertices, named, from 8e3b983:
# [1] 120 130 150 100 180

plot(g)

enter image description here

0 голосов
/ 18 июня 2019

Вот один из способов использования dplyr -

df %>% 
  arrange(apply(., 1, max))

  start_id end_id
1      120    130
2      130    150
3      150    100
4      100    180

В базе R -

df[order(apply(df, 1, max)), ]

  start_id end_id
4      120    130
1      130    150
3      150    100
2      100    180

Для буквенно-цифровых символов ids согласно вашему комментарию, вы можете использовать parse_number() из readr, который является частью tidyverse -

df %>% 
  arrange(apply(df, 1, function(x) max(parse_number(x))))

# in base R
df[order(apply(df, 1, function(x) max(parse_number(x)))), ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...