我有一个字符矢量,其中使用了长名称,它由几个以点号形式的定界符连接的单词组成。
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 frame和 how 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")
任何帮助将不胜感激。
答案 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"