Есть ли более простой способ написания кода сортировки? - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть список из 196 строк в форме 2009 / EPS.WCR.PL6.MAIS.0036, 2016 / EPS.WCR.PL6.NORM.0077 и т. Д. В зависимости от даты года и четыре числа в конце. Также есть НОРМА или МАИЗ. Я хотел бы просмотреть этот список и извлечь эти биты информации, чтобы создать некую матрицу расстояний. Код, который я написал до сих пор, выглядит следующим образом: c(substr(df[i,3], 1, 4),substr(df[1,3], 18, 21),substr(df[i,3], 22, nchar(df[i,4]))), где df - список этих катагорических переменных.

Где я перебираю список. Есть ли хороший способ получить расстояние между этими строками на основе битов информации, которую я извлекаю?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Следующая функция использует пакет CRAN stringdist для вычисления расстояний между строками в своем первом аргументе.Вы можете передать method на ваш выбор, см. Страницу справки help("stringdist").

special_dist <- function(x, method = "osa"){
  y <- sub("(^[[:digit:]]+).*[[:punct:]]([[:digit:]]+$)", "\\1\\2", x)
  res <- sapply(y, function(z) stringdist::stringdist(z, y, method = method))
  rownames(res) <- colnames(res)
  res
}

x <- c("2009/EPS.WCR.PL6.MAIS.0036", "2016/EPS.WCR.PL6.NORM.0077")
special_dist(x)
#         20090036 20160077
#20090036        0        4
#20160077        4        0

special_dist(x, "jaccard")
#          20090036  20160077
#20090036 0.0000000 0.5714286
#20160077 0.5714286 0.0000000
0 голосов
/ 13 ноября 2018

Если ваши данные имеют одинаковую структуру, попробуйте:

    data <- c("2009/EPS.WCR.PL6.MAIS.0036", "2016/EPS.WCR.PL6.NORM.0077")
    str(data)
    substr(data, start = 1, stop = 4)
    substr(data, start = 18, stop = 21)
    substr(data, start = 23, stop = 26)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...