使用rep()为数据框生成序列时遇行数无法被重复长度整除的问题
问题:为数据框分组赋值时遇行数无法整除的问题
需求:为age列中40岁及以上的行,给dateCompleted列分配2025-02-20和2025-02-19两个日期,尝试用rep()实现但因符合条件的行数无法被2整除报错。
使用的数据:
myDf = data.frame(names=c("john","ben","will","steve","david","harry","bill"), age=c(40,34,42,55,43,30,48), dateCompleted = NA)
尝试的代码(因行数非整除报错):
myDf$dateCompleted[which(myDf$age>=40)] = rep(c("2025-02-20", "2025-02-19"), each = length(myDf[which(myDf$age>=40),])/2)
期望的分配逻辑(行数可整除时的示例):优先将更多行分配给第一个日期,剩余给第二个日期。
解决方案:无需添加虚拟行
不需要添加虚拟行,有两种简单方法处理非整除场景:
方法1:利用rep()的length.out参数自动适配
rep()的length.out参数可以指定最终生成向量的长度,自动循环填充直到达到目标长度,无需提前确保整除:
# 获取符合条件的行索引 target_idx <- which(myDf$age >= 40) # 生成对应长度的日期向量并赋值 myDf$dateCompleted[target_idx] <- rep(c("2025-02-20", "2025-02-19"), length.out = length(target_idx))
此方法会按c("2025-02-20", "2025-02-19")的顺序循环填充,5行的结果为:前3个2025-02-20,后2个2025-02-19。
方法2:手动计算分组数量,实现平均分配
如果需要严格控制分组数量(多的行优先分配给第一个日期),可以手动计算两组的行数:
target_idx <- which(myDf$age >= 40) total_rows <- length(target_idx) # 第一组数量(向上取整,多的行给第一组) group1_num <- ceiling(total_rows / 2) # 第二组数量(向下取整) group2_num <- floor(total_rows / 2) # 拼接向量并赋值 myDf$dateCompleted[target_idx] <- c(rep("2025-02-20", group1_num), rep("2025-02-19", group2_num))
此方法完全匹配你期望的分配逻辑,5行时会得到3个2025-02-20和2个2025-02-19。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

