Getting values from nested list in separate columns

Viewed 70

I hope you can help me with something. Assume you have the following code:

library(gender)


test1 = tibble::tribble(
  ~name1,      ~name2, ~name3, ~name4, ~name5,
  "PETER",      "KLAUS",     NA,     NA,     NA,
  "HEIKE", "ANTONIA",     NA,     NA,     NA,
  "SANDRA", "HEIKO", "HEIKO", "HEIKE", "HEIKE"
)

male_female_row <- list()
for (row in 1:nrow(test1)) {
  x1=gender(as.character(test1[row,]))
  y = table(x1$gender)
  male_female_row[[row]] = y
}

than

model2 = do.call(rbind.data.frame, male_female_row) ### List to dataframe

creates a dataframe.

See for line 1, model2 shows 2,2 but I only have 2 male and 0 women (looking into the list male_female_row). How can I break up the two integers from the list (value) into two separate columns like $male $female?

when I code answer from @Rory:

male_values <- map(male_female_row, "male") %>%
  map(~ if_else(is.null(.x), 0, .x)) %>%
  unlist()

female_values <- map(male_female_row, "female") %>%
  map(~ if_else(is.null(.x), 0, .x)) %>%
  unlist()

tibble(male_values, female_values)

I get the failure:

 `false` must be a double vector, not an integer vector.
1 Answers

As a general tip, you can use map to easily access values from nested lists. The following uses this approach while returning a count of 0 if a female or male value is absent from a list element. This also works if one or more of the values in male_female_row is formatted as a character, not a number:

# Generate some data
male_female_row <- list(
  list(male = "1"),
  list(male = 2, female = "4"),
  list(male = 3),
  list(male = 5, female = 1),
  list(female = 7)
)

male_values <- map(male_female_row, "male") %>%
  map(~ if_else(is.null(.x), 0, .x)) %>%
  unlist()

female_values <- map(male_female_row, "female") %>%
  map(~ if_else(is.null(.x), 0, .x)) %>%
  unlist()

tibble(male_values, female_values)

Output:

# A tibble: 5 x 2
  male_values female_values
        <dbl>         <dbl>
1           1             0
2           2             4
3           3             0
4           5             1
5           0             7
Related