是否存在purrr::函数可替代mapply输出可添加至data的列而非list
解决方案
你可以使用purrr提供的带_vec后缀的映射函数直接生成向量,也可以结合dplyr的分组逻辑更简洁地完成需求,两种方案都可以直接把结果作为新列添加到原数据框中。
方案1:结合分组操作的最简写法
这种写法更符合tidyverse的使用习惯,不需要额外拆分分组计算行数:
library(tidyverse) # 原有数据导入代码 m= " study group outcome 1 1 A 1 1 B 1 2 A 1 2 B 2 1 A 2 1 B 2 2 A 2 2 B 3 1 B 4 1 A " data = read.table(text=m, h=T) set.seed(0) # 直接分组生成新列 data <- data %>% group_by(study) %>% mutate(random_val = rnorm(n = n(), mean = study[1] * 0.1)) %>% ungroup()
方案2:完全对齐原有mapply逻辑的purrr写法
如果你需要完全复用原有mapply的参数逻辑,可以用purrr::map2_vec,它会自动将各迭代返回的数值拼接为一个原子向量,而非list:
set.seed(0) # 提取每个study分组的行数,和原有逻辑一致 group_n <- sapply(group_split(data, study), nrow) # 直接生成可添加为列的向量 data$random_val <- purrr::map2_vec(.x = group_n, .y = 1:4 * 0.1, .f = rnorm)
结果说明
两种方案得到的random_val列和你原有mapply输出list调用unlist()后的结果完全一致,可直接使用。如果你使用的purrr版本较低没有_vec后缀,也可以用map2 + unlist(use.names = FALSE)替代,效果相同。
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

