从另一列中的一列中部分查找单元格内容

时间:2018-11-13 10:59:13

标签: r regex

我正在使用R studio在R上工作,

我有一个包含4列的数据框。 A栏包含乘客iD, B包含乘客姓名, C包含丈夫的名字。

我正在尝试创建一个新列,以查看C列中的丈夫姓名是否列在B列中的任何记录中。如果是这样,则应该向我返回A列中丈夫的乘客iD

为了使事情变得更复杂,例如在某些情况下的第一个示例中,丈夫在C列中给出的名字可能不包含他的姓氏,而在B列中将会包含他的姓氏。

library(stringr)
rm(list=ls())
passengerid <- c(0908,9883,7767,3302)

Name<- c("Backstrom, Mrs. Karl Alfred (Maria Mathilda Gustafsson)",
          "Backstrom, Mr. Karl Alfred John",
          "Cumings, Mrs. John Bradley (Florence Briggs Thayer)",
          "Cumings, Mr. John Bradley")

HusbandName <- c("Backstrom, Mr. Karl Alfred","","Cumings, Mr. John
Bradley","")



df1<- data.frame(cbind(passengerid,Name,HusbandName))
df1$Name <- as.character(df1$Name)
df1$HusbandName <- as.character(df1$HusbandName)

我尝试使用Stringr,但是遇到了问题,因为1)我需要代码仅查看向量HusbandName的1个元素并在整个向量Name中进行搜索。 2)考虑到我要查找的模式是矢量化的(如HusbandName),我发现很难使用正则表达式

这是我到目前为止尝试过的:

尝试1-仅查找完全匹配且不返回乘客ID且不向df添加列

df1$Husbandid < - for (i in 1:NROW(df1$HusbandName)) {
print(HusbandName[i] %in% Name)}

尝试2-查找部分匹配项,但不会忽略空格,不会告诉我乘客ID,也不会在df中添加列

df1$Husbandid <- for (i in 1:NROW(df1$HusbandName)) {
print(which(str_detect(df1$Name,df1$HusbandName[i])))}

#Attempt 3-几乎可以使用,但是-打印结果与作为新列添加到数据框中的结果不同。我该如何纠正呢?最终,我需要df中的内容是正确的。错误是那些没有丈夫的人在显示为丈夫或丈夫时应为空白或不。可以纠正这个问题,还是可以将for循环的输出转换为可以添加到df的向量?

 for (i in 1:NROW(df1$HusbandName)) {
     if (df1$HusbandName[i] =="") {
      print("Man") & next() 
      }
    FoundHusbandNames<- c(which(str_detect(df1$Name,df1$HusbandName[i])))
    print(df1$passengerid[FoundHusbandNames]) -> df1$Husbandid[i] }

1 个答案:

答案 0 :(得分:0)

这将为您提供名称实际匹配的ID,例如Cumings。不过,对于Backstrom而言,它将不起作用。不知道您是否错过了卡尔·阿尔弗雷德(Karl Alfred)末尾的“约翰”(John)还是数据不一致。如果是前者,那应该没事。

library(dplyr)
husbands <- df1[, c(1, 2)] %>% filter(HusbandName == '')
colnames(husbands)[2] <- "HusbandName"
df2 <- left_join(df1, husbands, by = "HusbandName")
View(df2)