Erik Brole
Erik Brole

Reputation: 355

Find gender based on a specific dataframe

Having a dataframe with have the gender of specific names

dfgender <- data.frame(name = c("Helen","Erik"), gender = c("F","M"))

How is it possible to use the previous data frame in order to check the names of another column of a dataframe and insert "Neutral" if the name is not in the list of gender dataframe: Example of the dataframe with the names:

dfnames <- data.frame(names = c("Helen", "Von", "Erik", "Brook"))

Example of expected output

dfnames <- data.frame(name = c("Helen", "Von", "Erik", "Brook"), gender = c("F", "Neutral", "M", "Neutral"))

Upvotes: 1

Views: 75

Answers (3)

Santiago
Santiago

Reputation: 706

Here's a solution similar to Juan C's but with, I think, a simpler replacement of NAs:

library(dplyr)
library(tidyr)

dfgender <- data.frame(name = c("Helen","Erik"), gender = c("F","M"))
dfnames <- data.frame(names = c("Helen", "Von", "Erik", "Brook"))

dfnames %>%
  left_join(dfgender, by = c("names" = "name")) %>%
  replace_na(list(gender = "Neutral"))
#   names  gender
# 1 Helen       F
# 2   Von Neutral
# 3  Erik       M
# 4 Brook Neutral

And here's another solution with no tidyr dependency:

library(dplyr)

dfgender <- data.frame(name = c("Helen","Erik"), gender = c("F","M"))
dfnames <- data.frame(names = c("Helen", "Von", "Erik", "Brook"))

dfnames %>%
  left_join(dfgender, by = c("names" = "name")) %>%
  mutate(gender = coalesce(gender, "Neutral"))
#   names  gender
# 1 Helen       F
# 2   Von Neutral
# 3  Erik       M
# 4 Brook Neutral

Upvotes: 0

harre
harre

Reputation: 7287

The (experimental) rows_update could be an intuitive compliment to @Juan C's answer:

library(dplyr)

dfnames |>
  mutate(gender = "Neutral") |>
  rows_update(rename(dfgender, names = name), "names")

Output:

  names  gender
1 Helen       F
2   Von Neutral
3  Erik       M
4 Brook Neutral

Upvotes: 1

Juan C
Juan C

Reputation: 6132

left_join + replace_na should do:

dfnames %>% left_join(dfgender, by=c('names' = 'name')) %>% 
  mutate(gender = gender %>% as.character %>% replace_na('Neutral'))

# names  gender
# 1 Helen       F
# 2   Von Neutral
# 3  Erik       M
# 4 Brook Neutral

Upvotes: 3

Related Questions