好的 - 正如标题所述,我正在尝试根据另一个数据帧列中的部分匹配为列分配值(在本例中为男性或女性)。
我有一个包含客户名称的大型数据库(db $ customer)和一个包含2000个最常见男孩和女孩名字(性别$ name)和性别(性别$性别)的数据框。我想,使用部分匹配,所以像
grepl()
,为数据库数据帧(db $ gender)
指定一个值这里有一些快速重现的代码:
customer <- c("Smith, Mary", "Johnson, Jack", "Doe, Jane", "Bronson, Charles", "Huckstable, Cliff", "Simpson, Jessica", "Simpson, Marge", "Mathews, Dave")
db <- as.data.frame(customer)
name <- c("Jack", "Charles", "Cliff", "Dave", "Mary", "Jane", "Jessica", "Marge")
gender <- c("M", "M", "M", "M", "F", "F", "F", "F")
gender <- as.data.frame(cbind(name, gender))
同样,我希望在db文件中添加一个性别列,指明客户名称是男孩还是女孩的名字。
非常感谢您的帮助!附:我搜索了知识库,也许是因为我不知道该找什么,找不到任何现有的帮助线程。
再次感谢!
答案 0 :(得分:1)
这应该做你想要的。
db$gender <- sapply(db$customer,FUN=function(x){
for(i in 1:nrow(gender)){
if (grepl(gender$name[i],x)){
return(gender$gender[i])
}
}
return(NA)
})
答案 1 :(得分:1)
这是另一个方向,但它不完整。它使用name2sex
包的qdap
函数。但是,我不确定如何满足数据库参数。
require(qdap)
db$customer <- as.character(db$customer)
first.names <- sapply(strsplit(db$customer, split = ","), "[", 2) # to get the first name only
first.names <- unlist(strip(first.names)) # to trim leading and trailing spaces, etc.
name2sex(names.list = first.names, database = qdapDictionaries::NAMES_SEX) # needs more
答案 2 :(得分:0)
由于gender
和db
中的名字是完全匹配,因此我们可以在将客户名称分为名字和姓氏后使用merge
。
db2 <- data.frame(do.call(rbind, strsplit(as.character(db$customer), ", +")))
merge(db2, gender, by.x="X2", by.y="name", all.x=TRUE)
X2 X1 gender
1 Charles Bronson M
2 Cliff Huckstable M
3 Dave Mathews M
4 Jack Johnson M
5 Jane Doe F
6 Jessica Simpson F
7 Marge Simpson F
8 Mary Smith F
我有&#34; +&#34;在", +"
调用中strsplit
,因为中有多个空格
"Huckstable, Cliff"
。否则就没必要了。