在数据集中搜索值 - 如果存在输出到值到列

Search Dataset For Value - If Exists Output To Value To Column

我对 R 比较陌生,学习了一些 类,等等。但是,我正在尝试做一些让我很困惑的事情,我似乎无法找到答案尽管这是一项看似微不足道的任务,而且可能已经完成了无数次。所以我有一个数据集,在该数据集中有一个字段 "Name",其中包含名称。但是,该字段包括姓名中的人员头衔,例如先生、夫人、小姐等。我要做的是创建一个新列 "Title"(我已经创建了该列)并让该列包含数字形式的标题,例如 Mr . = 1, Mrs. = 2, Miss = 3, 等等 我发现的解决方案提出了新的数据子集,但我真的不想那样,我想在当前数据集中添加一个包含此信息的新列。我意识到这对于那些有 R 经验的人来说可能听起来像是一项微不足道的任务,但它让我发疯。感谢您提供的任何帮助。

预期输出:

Name                    Title
Jones, Mr. Frank        1
Jennings, Mrs. Joan     2
Hinker, Miss. Lisa      3
Brant, Mrs. Jane        2
Allin, Mr. Hank         1
Minks, Mr. Jeff         1
Naps, Mr. Tim           1

我们可以使用 gsub 从 'Name' 列中提取 Mr/Mrs/Miss 子字符串,通过将 levels 指定为 [=] 来转换 factor vector中的17=]个元素,最后转换为numericclass。

使用gsub,我们从字符串^的开头匹配一个特定的模式,即匹配所有不是,[^,]+)后面的字符, 和零个或多个白色 space (\s*) 或 (|) 匹配字符 . (\.) 后跟字符不是 . ([^.]+) 直到字符串 ($) 并将其替换为 '', 之后的第二个参数)。

 v1 <- gsub('^[^,]+,\s*|\.[^.]+$', '', df1$Name)

 df1$Title <- as.numeric(factor(v1, levels=unique(v1)))

注意:我们也可以在levels中指定顺序,即factor(v1, levels= c('Mr', 'Mrs', 'Miss'))。在提供的示例中,unique 给出了预期输出中的正确顺序。

或者我们可以 match vector 和该向量中的 unique 个元素。

df1$Title <- match(v1, unique(v1))
df1
#                 Name Title
#1    Jones, Mr. Frank     1
#2 Jennings, Mrs. Joan     2
#3  Hinker, Miss. Lisa     3
#4    Brant, Mrs. Jane     2
#5     Allin, Mr. Hank     1
#6     Minks, Mr. Jeff     1
#7       Naps, Mr. Tim     1

数据

df1 <- structure(list(Name = c("Jones, Mr. Frank", "Jennings, Mrs. Joan", 
"Hinker, Miss. Lisa", "Brant, Mrs. Jane", "Allin, Mr. Hank", 
"Minks, Mr. Jeff", "Naps, Mr. Tim")), .Names = "Name", row.names = c(NA, 
-7L), class = "data.frame")