R 从独立列中的嵌套列表中获取值
我希望你能帮我做点什么。 假设您有以下代码:R 从独立列中的嵌套列表中获取值,r,R,我希望你能帮我做点什么。 假设您有以下代码: library(gender) test1 = tibble::tribble( ~name1, ~name2, ~name3, ~name4, ~name5, "PETER", "KLAUS", NA, NA, NA, "HEIKE", "ANTONIA", NA, NA, NA,
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
}
创建一个数据帧
请参见第1行,模型2显示了2,2,但我只有2个男性和0个女性(查看列表中的男性和女性行)。如何将列表(值)中的两个整数拆分为两个单独的列,如$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)
作为一般提示,您可以使用
map
轻松访问嵌套列表中的值。如果列表元素中缺少女性值或男性值,则以下方法在返回计数0时使用此方法。如果male\u female\u行
中的一个或多个值被格式化为字符而不是数字,则此操作也有效:
# 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)
#生成一些数据
男\女\行%
未列出()
女性价值%
映射(~if_else(is.null(.x),0.x))%>%
未列出()
TIBLE(男性值、女性值)
输出:
# 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
#一个tible:5 x 2
男性价值观女性价值观
1 1 0
2 2 4
3 3 0
4 5 1
5 0 7
谢谢您的回答。这几乎就是我想要的,我只想保持公向量和母向量的大小相同,所以当没有母向量时,我希望元素为0,以便比较每行的公向量和母向量。希望我能解释。谢谢你的澄清。我已经更新了我的答案来实现这一点-希望这就是你的想法。@Max H。它解决了你的问题吗?如果是,请随时接受,如果不是,请告诉我,我可以编辑它。再次感谢您的快速回答。现在我得到了失败:false
必须是双向量,而不是字符向量。但当我得到摘要(男/女排)时,一切都结束了numeric@MaxH. 这可能是因为嵌套列表中的一个(或多个)值是字符,而不是整数,所以map\u dbl
会抛出错误。我已经编辑了我的答案来解决这个问题。如果这仍然不完全正确,那么编辑您的问题以包含完整的起始数据将有助于找到解决方案。
# 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