我想创建一个列,在数据集中只写人的名字。在这种情况下,我只想得到一个列的值是 John, David, Carey, and David
和 NA
对于那些非人类或没有人类的价值观。然而,我面临两个困难。
第一是我需要过滤掉所有那些带大写字母的行。因为他们不是people,他们是entities。
第二,我需要提取逗号前的单词,因为那些是名字。
所以我就想知道有什么办法可以让人的名字的第一列有一个新的列。
可复制的数据集
structure(list(company_number = c("04200766", "04200766", "04200766",
"04200766", "04200766", "04200766"), directors = c("THOMAS, John Anthony",
"THOMAS, David Huw", "BRIGHTON SECRETARY LIMITED", "THOMAS, Carey Rosaline",
"THOMAS, David Huw", "BRIGHTON DIRECTOR LIMITED")), row.names = c(NA,
-6L), class = c("data.table", "data.frame"))
我们可以这样做。
首先取逗号后的第一个字
df$names <- sub(".*?, (.*?) .*","\\1",df$directors)
然后将任何一个字以上的字符串,使之成为 <NA>
df$names <- ifelse(sapply(strsplit(df$names, " "), length)>1,NA,df$names)
输出。
> df
company_number directors names
1 04200766 THOMAS, John Anthony John
2 04200766 THOMAS, David Huw David
3 04200766 BRIGHTON SECRETARY LIMITED <NA>
4 04200766 THOMAS, Carey Rosaline Carey
5 04200766 THOMAS, David Huw David
6 04200766 BRIGHTON DIRECTOR LIMITED <NA>
使用 str_extract
:
library(dplyr)
library(stringr)
df %>% mutate(people = str_extract(directors, '(?<=,\\s)\\w+'))
# company_number directors people
#1: 04200766 THOMAS, John Anthony John
#2: 04200766 THOMAS, David Huw David
#3: 04200766 BRIGHTON SECRETARY LIMITED <NA>
#4: 04200766 THOMAS, Carey Rosaline Carey
#5: 04200766 THOMAS, David Huw David
#6: 04200766 BRIGHTON DIRECTOR LIMITED <NA>