基于Department列数据重新计算人员工时列值:R语言lapply函数使用问题求助
问题排查与解决方案
我来帮你搞定这个问题,先拆解下你代码里的错误,再给出符合需求的实现方案~
你的代码存在的问题
- 列索引错误:你写的
mydata4[3:15]选中了过多列,原始数据里name1到name7对应的是第3到第9列(前两列是Date和department),这个范围明显超出了目标列。 - 计算逻辑完全偏离需求:
x + x[1]/13这部分有两个核心问题:x[1]取的是当前列的第一行值,而不是对应行的department数值,无法实现每行单独分配的逻辑;- 除以13和需求里“平均分给7位人员”的要求不符,应该是除以7。
正确的实现方案
方法1:用dplyr包(简洁易读,推荐)
如果习惯用tidyverse风格的代码,用mutate()配合across()可以轻松实现:
library(dplyr) # 生成处理后的数据集:给每个name列加上对应行department/7的值,同时移除原department列 processed_data <- mydata4 %>% mutate(across(starts_with("name"), ~ .x + department / 7)) %>% select(-department)
starts_with("name")会自动选中所有以name开头的列(也就是name1到name7);~ .x + department / 7表示对每个选中的列,把该列的值加上当前行的department除以7的结果;select(-department)是可选操作,用来移除不再需要的原department列。
方法2:Base R实现(无需额外安装包)
如果不想用第三方包,用基础R代码也能实现:
# 确定name列的位置:第3到第9列 name_col_indices <- 3:9 # 计算每行需要分配给每个人员的数值 per_person_allocation <- mydata4$department / 7 # 给每个name列加上对应分配值 mydata4[name_col_indices] <- mydata4[name_col_indices] + per_person_allocation # 移除原department列(可选) processed_data <- mydata4[, -2]
验证效果
以2022/05行为例,department=117.89,每人分配的数值是117.89/7≈16.84,所以name1的新值就是85.37+16.84≈102.21,完全符合你期望的输出逻辑。
内容的提问来源于stack exchange,提问作者Диана
相关产品推荐
相关产品推荐

