【问题标题】:How to transform long names into shorter (two-part) names如何将长名称转换为较短(两部分)名称
【发布时间】:2019-04-23 11:29:23
【问题描述】:

我有一个字符向量,其中使用了长名称,它将由几个单词组成,这些单词由分隔符以点的形式连接。

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

任何帮助将不胜感激。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以执行以下操作:

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

    【讨论】:

      【解决方案2】:

      在点上拆分,子串 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"
      

      【讨论】:

        【解决方案3】:

        这里的解决方案不如 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"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-07
          • 2022-08-16
          • 1970-01-01
          • 1970-01-01
          • 2010-11-28
          • 2012-05-04
          相关资源
          最近更新 更多