通过使用正则表达式匹配的称号。编写创建了一个名为“女性”新列,并根据在“名称”栏中提供的文本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
任何人都可以请帮我在这?
如果您想对非指定的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
这里是一个更有效的版本,已经做了你问什么了。仍然需要指定所有可能的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)))