首页 > 解决方案 > 从单独列中的嵌套列表中获取值

问题描述

我希望你能帮助我一些事情。假设您有以下代码:

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
}

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

创建一个数据框。

请参阅第 1 行,model2 显示 2,2 但我只有 2 名男性和 0 名女性(查看列表 male_female_row)。如何将列表(值)中的两个整数分成两个单独的列,如 $male $female?

当我从@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)

我得到了失败:

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

标签: r

解决方案


作为一般提示,您可以使用map轻松访问嵌套列表中的值。如果列表元素中不存在女性或男性值,则以下使用此方法返回计数 0。如果其中的一个或多个值male_female_row被格式化为字符而不是数字,这也有效:

# 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)

输出:

# 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

推荐阅读