如何在输出CSV中添加取值自文件夹名的City_Name列?
解决方法
你可以通过以下步骤为输出CSV添加City_Name列:
- 提取当前文件夹的城市名称:用
basename()函数从文件夹路径中提取纯城市名称(比如从完整路径里拿到NYR或KAN),避免直接用完整路径作为城市名。 - 在汇总后添加城市列:在
dplyr的链式操作里,用mutate()新增一列,每行填充提取到的城市名称。
修改后的完整代码如下:
for (idx in seq_along(dirlist)){ # 提取当前城市名称(从文件夹路径中获取纯名称) city_name <- basename(dirlist[idx]) filelist <- list.files(path = dirlist[idx], full.names = TRUE, recursive = TRUE, pattern = ".txt$") dt_ <- read_the_files(filelist) dt.tidied <- adj_col_names(dt_) # 合并数据 merged <- rbindlist(dt.tidied, fill = TRUE, use.names = TRUE) # 选择输出列 selected_column <- c('YYmmdd', 'Temp', 'Pres') # 计算日均值并添加城市列 avg_dl <- merged %>% select(all_of(selected_column)) %>% # 先筛选需要的列,避免处理无关数据 group_by(YY_mm_dd = lubridate::floor_date(`YYmmdd`, "1 day")) %>% summarise(across(where(is.numeric), ~ if(sum(is.na(.x)) > 5) NA else mean(.x, na.rm = TRUE))) %>% mutate(City_Name = city_name) %>% # 新增城市列,每行填充当前城市名 write.csv(paste0(dirlist[idx],"_dl.csv"), row.names = FALSE) # 建议加上row.names=FALSE避免输出行号 }
为什么之前用cbind可能失败?
如果是在group_by之前用cbind(merged, City_Name = city_name),虽然能给原始数据加列,但后续group_by + summarise会把非分组列、非汇总列丢弃,导致最终输出里没有City_Name。而在summarise之后用mutate,是直接给汇总后的日均值数据加固定值列,不会被丢弃。
内容的提问来源于stack exchange,提问作者Alexia k Boston
相关产品推荐
相关产品推荐

