R语言:group_by与mapply采样后,如何将二维数组转为一维列表?
问题:生成一维列表形式的嵌套采样结果
给定数据框和字符向量:
dat = data.frame(a = c(1,0,3), b = c(9, 8, 7)) vec = c("A", "B", "C", "D", "E")
原尝试按a、b分组后,用summarise生成嵌套列c,每个分组执行3次采样(采样大小为b-a),代码如下:
df = dat %>% group_by_all() %>% summarise(c = replicate(3, list(mapply(function(x, y) sample(vec, size = x - y, replace = TRUE), b, a))))
但输出的列c条目是二维数组形式,执行unnest(c)后列名变为c[,1],需要简化流程,让列c的元素为一维列表。
修正方案
问题根源是mapply默认返回数组结构,只需调整采样逻辑,将结果转换为一维向量即可:
方法1:使用purrr::map2替代mapply
map2会直接返回一维向量,配合replicate的simplify = FALSE参数保持列表结构:
library(dplyr) library(purrr) df = dat %>% group_by_all() %>% summarise(c = replicate(3, map2(b, a, ~sample(vec, size = .x - .y, replace = TRUE)), simplify = FALSE))
方法2:在mapply结果后转换为一维向量
通过as.vector()将mapply返回的数组转为一维向量:
df = dat %>% group_by_all() %>% summarise(c = replicate(3, list(as.vector(mapply(function(x, y) sample(vec, size = x - y, replace = TRUE), b, a))), simplify = FALSE))
两种方法生成的列c元素均为一维向量,示例如下:
[[1]] [1] "B" "D" "A" "C" "A" "E" "B" "C"
后续执行df %>% unnest(c)时,会直接得到名为c的列,无需额外重命名。
内容的提问来源于stack exchange,提问作者Elis
相关产品推荐
相关产品推荐

