找出字符串中的第4个数字是否是r中的数字或字符

时间:2017-12-01 12:56:08

标签: r if-statement

通过以下链接找到的问题。

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)

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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"

答案 2 :(得分:0)

在您的情况下,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