You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 06:54:34