Как преобразовать длинные имена в короткие (из двух частей) - PullRequest
3 голосов
/ 23 апреля 2019

У меня есть символьный вектор, в котором используются длинные имена, который будет состоять из нескольких слов, соединенных разделителями в виде точки.

x <- c("Duschekia.fruticosa..Rupr...Pouzar",
       "Betula.nana.L.",
       "Salix.glauca.L.",
       "Salix.jenisseensis..F..Schmidt..Flod.",
       "Vaccinium.minus..Lodd...Worosch")

Длина имен отличается. Но важны только первые два слова всего имени.

Моя цель - получить имена до 7 символов: 3 начальных символа из первых двух слов и разделитель в виде «точки» между ними.

Эти примеры очень близки к моему запросу, но я не знаю, как применить эти варианты кода к моему случаю. R Как удалить символы из длинных имен столбцов во фрейме данных и как добавить имена к "именам столбцов" кадра выходных данных в R?

Что я должен сделать, чтобы имена выходов выглядели так?

x <- c("Dus.fru",
       "Bet.nan",
       "Sal.gla",
       "Sal.jen",
       "Vac.min")

Буду признателен за любую помощь.

Ответы [ 3 ]

8 голосов
/ 23 апреля 2019

Вы можете сделать следующее:

gsub("(\\w{1,3})[^\\.]*\\.(\\w{1,3}).*", "\\1.\\2", x)
# [1] "Dus.fru" "Bet.nan" "Sal.gla" "Sal.jen" "Vac.min"

Сначала мы сопоставляем до 3 символов (\\w{1,3}), затем игнорируем все, что не является точкой [^\\.]*, сопоставляем с точкой \\., а затем снова до 3 символов (\\w{1,3}). Наконец, все, что приходит после этого .*. Затем мы используем только вещи в скобках и разделяем их точкой \\1.\\2.

3 голосов
/ 23 апреля 2019

Разделить на точки, подстроку 3 символа, а затем вставить обратно:

sapply(strsplit(x, ".", fixed = TRUE), function(i){
  paste(substr(i[ 1 ], 1, 3), substr(i[ 2], 1, 3), sep = ".")
})
# [1] "Dus.fru" "Bet.nan" "Sal.gla" "Sal.jen" "Vac.min"
1 голос
/ 23 апреля 2019

Здесь менее изящное решение, чем у kath, но его немного легче читать, если вы не являетесь экспертом в области регулярных выражений.

# Your data
x <- c("Duschekia.fruticosa..Rupr...Pouzar",
       "Betula.nana.L.",
       "Salix.glauca.L.",
       "Salix.jenisseensis..F..Schmidt..Flod.",
       "Vaccinium.minus..Lodd...Worosch")

# A function that takes three characters from first two words and merges them    
cleaner_fun <- function(ugly_string) {
  words <- strsplit(ugly_string, "\\.")[[1]]
  short_words <- substr(words, 1, 3)
  new_name <- paste(short_words[1:2], collapse = ".")
  return(new_name)
}

# Testing function
sapply(x, cleaner_fun)
[1]"Dus.fru" "Bet.nan" "Sal.gla" "Sal.jen" "Vac.min"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...