R:如何在一个数据帧中匹配另一个数据帧中的部分字符串,并根据条件分配值?

时间:2014-07-28 20:08:41

标签: r

好的 - 正如标题所述,我正在尝试根据另一个数据帧列中的部分匹配为列分配值(在本例中为男性或女性)。

我有一个包含客户名称的大型数据库(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文件中添加一个性别列,指明客户名称是男孩还是女孩的名字。

非常感谢您的帮助!附:我搜索了知识库,也许是因为我不知道该找什么,找不到任何现有的帮助线程。

再次感谢!

3 个答案:

答案 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)

由于genderdb中的名字是完全匹配,因此我们可以在将客户名称分为名字和姓氏后使用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"。否则就没必要了。