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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:00:05