在map()函数中使用spread()遇阻,求处理列表中tibble的方法
解决在
map()中使用spread()的问题 嘿,别发愁,这个问题其实很好解决!你只需要正确把spread()(或者官方更推荐的pivot_wider(),后面会提到)和map()结合,就能对列表里的每个tibble批量完成宽表转换了。
方法一:用公式语法指定元素
你可以借助map()的公式写法,通过.x指代列表里的每个tibble元素,再给spread()传入key和value参数:
# 先加载需要的包 library(purrr) library(tidyr) library(tibble) # 你的示例数据 data1 <- tibble(size = c("1", "2", "3", "4"), color = c("blue", "green", "yellow", "black")) data2 <- tibble(size = c("7", "3", "10", "1"), color = c("orange", "yellow", "red", "white")) dataList <- list(data1, data2) # 批量应用spread() result <- map(dataList, ~spread(.x, key = size, value = color)) # 查看结果 result
运行后会得到一个包含两个宽表的列表,每个元素对应原列表中tibble的转换结果:
[[1]] # A tibble: 1 × 4 `1` `2` `3` `4` <chr> <chr> <chr> <chr> 1 blue green yellow black [[2]] # A tibble: 1 × 4 `1` `3` `7` `10` <chr> <chr> <chr> <chr> 1 white yellow orange red
方法二:直接传递函数参数
还可以不用公式,直接把spread()作为参数传给map(),再依次指定spread()需要的key和value——map()会自动把列表中的每个元素作为spread()的第一个输入(也就是data参数):
result <- map(dataList, spread, key = size, value = color)
这个写法更简洁,效果和方法一完全一致。
额外建议:改用pivot_wider()
要注意的是,spread()已经被tidyr标记为已退役(retired),官方更推荐功能更强大的pivot_wider(),用法类似且未来兼容性更好:
# 用pivot_wider的公式写法 result <- map(dataList, ~pivot_wider(.x, names_from = size, values_from = color)) # 或者简洁写法 result <- map(dataList, pivot_wider, names_from = size, values_from = color)
这个写法同样能得到你想要的结果哦~
内容的提问来源于stack exchange,提问作者ludo
相关产品推荐
相关产品推荐

