如何在dplyr分组操作中为rep()的times参数传入分组对应值
问题原因及解决方案
核心报错原因
- 构造数据集时使用
cbind()拼接字符型与数值型向量,cbind()会自动将所有元素统一转为字符型,因此my_data$observations实际为字符串格式,无法直接作为rep()的times参数(该参数要求输入数值型)。 - 原始分组代码中
group_by后直接调用mutate生成多长度的rep()返回值,未将结果包裹为列表,会因为输出长度和原数据行长度不匹配触发报错;此外代码中引用的分组变量grouping3在原数据中不存在,也是报错原因之一。
优化实现方案
你自行摸索的rowwise+列表嵌套的方案是可行的,在此基础上提供两种更高效的实现:
方案1:保留rowwise逻辑的修正版
library(dplyr) library(tidyr) # 先修正observations列的数据类型 my_data <- my_data %>% mutate(observations = as.numeric(observations)) new_data <- my_data %>% distinct(grouping1, grouping2, .keep_all = TRUE) %>% rowwise() %>% mutate(sim_count = list(rep(1:100, times = observations))) %>% unnest_longer(sim_count) %>% arrange(sim_count)
方案2:使用uncount实现向量化运算(大数据量下性能更优)
tidyr::uncount可以直接按指定权重重复行,无需逐行迭代:
library(dplyr) library(tidyr) new_data <- my_data %>% # 修正数据类型 mutate(observations = as.numeric(observations)) %>% # 取每个分组的唯一值,保留对应的observations distinct(grouping1, grouping2, .keep_all = TRUE) %>% # 按observations重复每个组的行 uncount(observations) %>% # 每个组内生成1~100的重复序列 group_by(grouping1, grouping2) %>% mutate(sim_count = rep(1:100, length.out = n())) %>% ungroup() %>% arrange(sim_count)
内容的提问来源于stack exchange,提问作者MeC
相关产品推荐
相关产品推荐

