Как определить пол с учетом строки символов? - PullRequest
1 голос
/ 20 марта 2020

У меня есть такой фрейм данных, что ...

df_example<- data.frame(
Name_example = c("John L. Smith", "Mary C. Boregart", "Alphusia D. Oregeno", "Mike A. Doo-doo-butt"),
Profile_example = c("Mr. Smith advises U.S. clients in complying with finger-paint laws. Mr. Smith received his J.D. from fake law school.", 
"Her experience includes identifying green and blue trains", 
"She helps investors seek out the boogeyman. Alphusia also knows karate.", 
"Mike specializes on the full spectrum of sandcastles"))

Я хотел бы создать новый столбец с указанием пола каждого имени на основе информации в профиле.

Я пытался что-то вроде этого ...

ifelse(str_detect(df_example$Profile_example, "she|She|her|Her"), gender<-"F", gender<-"M" )

, который сохраняет запись только для имени ("M") вместо всех 4.

Как бы вы go решили эту проблему? Что делать, если у вас были сотни имен и каждый профиль был длиной в несколько абзацев?

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Один из вариантов, если в профиле нет местоимения (он или она и др. c.), - это использовать набор данных babynames из пакета с тем же именем. Набор данных содержит миллионы имен детей, родившихся в США, вместе с полом и долей (доля людей этого пола с таким именем, родившихся в этом году).

Сначала создайте имена для каждого человека.

df_example$name <- sub("([A-Za-z]+).*", "\\1", df_example$Name_example)

Затем суммируйте имена малышей, чтобы получить одно уникальное имя (наиболее распространенное, если оно используется обоими полами).

library(babynames)
librayr(dplyr)

Babies <- babynames %>%
  group_by(sex, name) %>%
  summarise(prop=mean(prop)) %>%  # Mean over all years
  group_by(name) %>%
  arrange(-prop) %>%  # need to arrange by prop descending 
  slice(1) %>% select(-prop)  # and then select the most common sex for each name

Приведенный выше код используется для получения наиболее распространенного пола для одного уникального имени для имен, общих для обоих полов (Riley, Jordan, et c.).

Затем мы объединяем примерный набор данных с этими обобщенными данными по именам детей.

library(dplyr)
left_join(df_example, Babies, by="name")
      name  sex
1     John    M
2     Mary    F
3 Alphusia <NA>
4     Mike    M

Мы видим, что пол «Майка» - мужской, но «Альфузия» слишком необычна, чтобы это выяснить.

1 голос
/ 20 марта 2020

Использование grepl в сочетании с ifelse должно выполнять эту работу:

gender <- ifelse(grepl("she|She|her|Her", df_example$Profile_example), "F", "M" )

Производительность должна быть хорошей даже при очень больших наборах данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...