求助:批量修改多份电子表格指定列随机单元格的R脚本报错问题
解决方案
报错根源
dir("folder1")仅返回文件名(如file1.xlsx),但文件实际存放在folder1子目录下,当前工作目录是上级路径,因此直接用文件名读取会找不到文件。
修正代码
# 获取folder1内所有Excel文件的完整路径 list_of_files <- dir("folder1", full.names = TRUE) for(f in list_of_files){ # 读取指定工作表 df1 <- openxlsx::read.xlsx(f, sheet = "data", colNames = TRUE) # 随机选1行,修改math_marks为60-95的随机整数 rand_row <- sample(nrow(df1), 1) df1$math_marks[rand_row] <- sample(60:95, 1) # 覆盖写入原文件 openxlsx::write.xlsx(df1, file = f, sheetName = "data", colNames = TRUE, overwrite = TRUE) }
关键修改说明
- 路径补全:
dir()添加full.names = TRUE,返回完整路径(如folder1/file1.xlsx),确保文件定位准确。 - 语法适配:原代码使用data.table的
:=赋值,但read.xlsx默认返回data.frame,改用data.frame原生赋值方式避免语法错误。 - 随机数优化:用R内置
sample()生成固定随机值,比调用Excel函数更直接;若需生成Excel动态公式,可替换为openxlsx::writeFormula(df1, x = "=RANDBETWEEN(60,95)", startCol = which(colnames(df1)=="math_marks"), startRow = rand_row+1)(注意行号偏移,因为表头占1行)。 - 覆盖权限:显式添加
overwrite = TRUE,确保允许覆盖原文件。
扩展:批量修改多个单元格
若需要修改多个单元格,调整sample的数量参数即可:
# 随机修改5个单元格示例 rand_rows <- sample(nrow(df1), 5) df1$math_marks[rand_rows] <- sample(60:95, 5, replace = TRUE)
内容的提问来源于stack exchange,提问作者Mathew S
相关产品推荐
相关产品推荐

