如何使用正则表达式匹配一个人的职称

问题描述 投票:2回答:1

通过使用正则表达式匹配的称号。编写创建了一个名为“女性”新列,并根据在“名称”栏中提供的文本TRUE / FALSE值填充它 - [R片段。一样,如果它是“小姐”的确,如果没有称呼指定为“NA”

这是数据帧

df <- data.frame(PersonID=1:8, Name=c("Mr. Bob", "Ms. Blank", "Roger, Mr.", "MR Mark Simpson", "Miss Lisa", "Mrs. joshep", "Rakesh Kumar", "Kumar Gums Murphy"))

grepl("Miss", df, perl=TRUE)

输出:

FALSE,FALSE,FALSE

预期输出:

FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,NA,NA

任何人都可以请帮我在这?

r grepl
1个回答
1
投票

如果您想对非指定的NA你必须先排除其它名称不存在。也就是说,仅仅因为"Miss"不存在并不意味着"Mr""MISS"都没有。

下面将分配"M""F"NA在你的榜样。请根据需要添加指定。

Titles <- c("Miss", "Ms","Mr","Mrs","MR","MS","MRS","MISS") # vector of possible titles
f.Titles <- c("Miss", "Ms","Mrs","MS","MRS","MISS") # vector of female specific titles
check <- NULL
for(i in 1:length(Titles)){
  check <- cbind(check,grepl(Titles[i], df$Name, perl=TRUE))
}

colnames(check) <- Titles
apply(check,1,function(x)ifelse(!any(x),NA,
                                ifelse(any(names(which(x)) %in% f.Titles),"F","M")))

输出:

[1] "M" "F" "M" "M" "F" "F" NA  NA 

从那里,它的一个简单

G <- apply(check,1,function(x)ifelse(!any(x),NA,
                                     ifelse(any(names(which(x)) %in% f.Titles),"F","M")))

df$Female <- ifelse(G=="F",TRUE,ifelse(is.na(G),NA,FALSE))
df
  PersonID              Name Female
1        1           Mr. Bob  FALSE
2        2         Ms. Blank   TRUE
3        3        Roger, Mr.  FALSE
4        4   MR Mark Simpson  FALSE
5        5         Miss Lisa   TRUE
6        6       Mrs. joshep   TRUE
7        7      Rakesh Kumar     NA
8        8 Kumar Gums Murphy     NA

编辑1:

这里是一个更有效的版本,已经做了你问什么了。仍然需要指定所有可能的Titles,女冠军(f.Titles

check <- apply(as.matrix(Titles), 1, function(x) grepl(x, df$Name, perl=TRUE))
colnames(check) <- Titles
df$Female <- apply(check,1,function(x)ifelse(!any(x),NA,ifelse(any(names(which(x)) %in% f.Titles),TRUE,FALSE)))
© www.soinside.com 2019 - 2024. All rights reserved.