【问题标题】:Finding out if the 4th digit in a string is a number or character in r找出字符串中的第 4 位数字是 r 中的数字还是字符
【发布时间】:2017-12-01 12:56:07
【问题描述】:

从以下链接中找到的问题开始。

How to test if the first three characters in a string are letters or numbers in r?

如何包含它以检查第 4 个字符是否也是数字?例如,我的数据框示例如下。

ID   X
1   MJF34
2   GA249D
3   DEW235R
4   4SDFR3
5   DAS3
6   BHFS7

同样,我希望字符串中的前三个字符是字母,我还希望第四个字符是 0-9 之间的任何数字。如果达到给定的规则,那么我希望它将 X 变量的前三个字母粘贴到新列中。如果不是,我希望它说“FR”。因此最终的数据集如下。

ID    X       Y
1    MJF34   MJF 
2    GA249D  FR
3    DEW235R DEW
4    4SDFR3  FR
5    DAS3    DAS
6    BHFS7   FR

到目前为止,我检查前三个字母的是:

sub_string<-substr(df$X, 1, 3)

df$Y<-ifelse(grepl('[0-9]',sub_string), "FR", sub_string)

我尝试将其扩展为第 4 个,但似乎不起作用。

sub_number<-substr(df$X, 4, 4)
df$Y<-ifelse(grepl('[0-9]',sub_string) && !grepl('[0-9]',sub_number), "FR", sub_string)

我可能在做一些明显错误但似乎无法弄清楚的事情? 提前致谢

【问题讨论】:

    标签: r if-statement


    【解决方案1】:

    我会使用这样的逻辑索引:

    idx <- grepl("^[A-Z]{3}\\d", df$X) # you can use ignore.case=TRUE too
    df$Y <- "FR"
    df[idx, "Y"] <- substr(df[idx, "X"], 1, 3)
    
    #  ID       X   Y
    #1  1   MJF34 MJF
    #2  2  GA249D  FR
    #3  3 DEW235R DEW
    #4  4  4SDFR3  FR
    #5  5    DAS3 DAS
    #6  6   BHFS7  FR
    

    【讨论】:

      【解决方案2】:

      根据您发布的代码,您可以使用:

      x = c("MJF34", "GA249D", "DEW235R")
      
      ifelse(grepl('[0-9]',substr(x, 1, 3)) | !grepl('[0-9]',substr(x, 4, 4)), "FR", substr(x, 1, 3))
      
      # [1] "MJF" "FR"  "DEW"
      

      如果您想在代码中再次使用它,可以将其存储为函数:

      vec = c("MJF34", "GA249D", "DEW235R")
      
      UpdateVector = function(x) ifelse(grepl('[0-9]',substr(x, 1, 3)) | !grepl('[0-9]',substr(x, 4, 4)), "FR", substr(x, 1, 3))
      
      UpdateVector(vec)
      
      # [1] "MJF" "FR"  "DEW"
      

      【讨论】:

        【解决方案3】:

        stringr 包可能对您有用:

        library(dplyr)
        library(stringr)    
        
        df %>%
          mutate(Y = if_else(str_detect(X, "^[A-Z]{3}[0-9]"), 
                             str_sub(X, start = 1, end = 3), 
                             "FR"))
        

        输出:

        # A tibble: 6 x 3
         ID       X     Y
          <int>   <chr> <chr>
        1     1   MJF34   MJF
        2     2  GA249D    FR
        3     3 DEW235R   DEW
        4     4  4SDFR3    FR
        5     5    DAS3   DAS
        6     6   BHFS7    FR
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-01
          相关资源
          最近更新 更多