我正在使用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),我发现很难使用正则表达式
这是我到目前为止尝试过的:
df1$Husbandid < - for (i in 1:NROW(df1$HusbandName)) {
print(HusbandName[i] %in% Name)}
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] }
答案 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)