如何将长名称转换为短名称(两部分)

时间:2019-04-23 11:29:24

标签: r

我有一个字符矢量,其中使用了长名称,它由几个以点号形式的定界符连接的单词组成。

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

名称的长度不同。但是,只有全名的前两个字很重要。

我的目标是获得最多7个符号的名称:前两个单词中包含3个初始符号,并在它们之间以“点”的形式分隔。

这些示例非常接近我的要求,但是我不知道如何将这些代码变体应用于我的案例。 R How to remove characters from long column names in a data framehow to append names to " column names" of the output data frame in R?

如何使出口名称看起来像这样?

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

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:8)

您可以执行以下操作:

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分隔它们。

答案 1 :(得分:3)

分割成点,子字符串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"

答案 2 :(得分:1)

与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"