如何在遍历多个数据框的for循环中使用dplyr的mutate()函数
核心错误原因
你调整后代码运行失败的核心原因是:你新增time_seconds_wholemeasurement字段的操作是赋值给了临时变量datafile_wholemeasurement,但后续筛选、新增测试时段字段时,仍然调用的是原始列表里的file_contents[[i]],这个原始数据框没有你刚新增的时间字段,自然会报对象找不到的错误。
修正后的可运行代码
library(dplyr) # 基础数据构造(和原有逻辑一致) d1 <- data.frame(P=c(1,5,2,3,4,7,5,6,7), E=c(4,5,6,4,5,6,4,5,6)) d2 <- data.frame(P=c(0,9,8,5,4,7,5), E=c(6,5,4,6,5,4,5)) d3 <- data.frame(P=c(6,5,4,6,5,4,6,5,4), E=c(3,2,1,5,5,5,5,5,5)) d4 <- data.frame(P=c(5,9,9,5,2,2,1,8,5,7,6,5),E=c(8,8,8,8,8,8,8,8,8,8,8,8)) file_contents <- list(d1, d2, d3, d4) # 存储起止索引的结果表 res <- data.frame(teststart = rep(NA,length(file_contents)), testend =rep(NA,length(file_contents))) # 新增:存储每个数据框处理后的全量数据、测试时段数据,方便后续分析调用 processed_list <- vector("list", length(file_contents)) for(i in 1:length(file_contents)) { # 先给当前数据框新增全量测量时间列,后续所有操作都用这个已新增字段的df datafile_wholemeasurement <- file_contents[[i]] %>% mutate(time_seconds_wholemeasurement = seq(from = 30, to = nrow(.)*30, by = 30)) # 用nrow(.)指代当前df,写法更通用 # 定位起止位置 teststart <- which(datafile_wholemeasurement$P == 5)[1] testend <- which(datafile_wholemeasurement$P == 5)[2] # 筛选测试时段数据 + 新增测试时段时间列,直接用已加全量时间字段的datafile_wholemeasurement处理 datafile_testduration <- datafile_wholemeasurement %>% filter(between(row_number(), teststart, testend-1)) %>% mutate(time_seconds_testduration = time_seconds_wholemeasurement - first(time_seconds_wholemeasurement)) # 结果写入 res$teststart[[i]] <- teststart res$testend[[i]] <- testend processed_list[[i]] <- list( whole_measurement = datafile_wholemeasurement, test_duration = datafile_testduration ) }
结果调用说明
运行完成后:
- 你可以通过
res查看所有数据框的测试起止索引 - 可以通过
processed_list[[序号]]$test_duration查看对应序号数据框的测试时段处理结果,已经包含你需要的所有新增字段 - 如果你不需要保留全量测量数据,也可以调整
processed_list的存储逻辑,只保留测试时段数据即可
内容的提问来源于stack exchange,提问作者user16822752
相关产品推荐
相关产品推荐

