通过以下链接找到的问题。
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)
我可能做了一些明显错误的事情,但似乎无法弄明白? 提前致谢
答案 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