在R中获得一个新的列,只包含名字。

问题描述 投票:-2回答:1

我想创建一个列,在数据集中只写人的名字。在这种情况下,我只想得到一个列的值是 John, David, Carey, and DavidNA 对于那些非人类或没有人类的价值观。然而,我面临两个困难。

第一是我需要过滤掉所有那些带大写字母的行。因为他们不是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"))
r regex dplyr data.table stringr
1个回答
3
投票

我们可以这样做。

首先取逗号后的第一个字

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>

1
投票

使用 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>
© www.soinside.com 2019 - 2024. All rights reserved.