如何用R计算目录下各文件中Value1列带“1”值的占比
R语言实现多文本文件的标识后缀占比计算
我有一个目录下的一系列结构一致的.txt文件,数据结构示例如下:
| Date | Value1 | Value2 |
|---|---|---|
| 2022-03-14 13:00:00 | AMRO 1 | 3 |
| 2022-03-14 13:10:00 | AMRO 1 | 4 |
| 2022-03-14 13:20:00 | DEJU | 5 |
| 2022-03-14 13:30:00 | MALL | 6 |
| 2022-03-14 13:40:00 | AMRO | 7 |
| 2022-03-14 13:50:00 | CHSP 1 | 8 |
| 2022-03-14 14:00:00 | AMRO | 40 |
| 2022-03-14 14:10:00 | AMRO | 50 |
| 2022-03-14 14:20:00 | DEJU 1 | 60 |
| 2022-03-14 14:30:00 | AMRO 1 | 70 |
| 2022-03-14 14:40:00 | AMRO | 80 |
| 2022-03-14 14:50:00 | CHSP | 90 |
需求是:针对每个文件,计算Value1列中每个基础标识(如AMRO)对应的带“ 1”后缀的条目数与该标识总条目数的比值。比如示例中AMRO系列共7条,其中3条带“1”,比值为3/7≈43%;DEJU为1/2=50%,MALL为0/1=0%,CHSP为1/2=50%。
以下是实现该需求的R语言方案:
1. 加载依赖包
使用tidyverse处理数据,fs简化文件路径操作(也可以用基础R的list.files替代):
# 未安装包时先执行安装 install.packages(c("tidyverse", "fs")) # 加载包 library(tidyverse) library(fs)
2. 定义单文件处理函数
编写函数读取单个文件并完成计算逻辑:
calculate_suffix_ratio <- function(file_path) { # 读取文本文件(默认制表符分隔,根据实际分隔符调整sep参数) df <- read_delim(file_path, delim = "\t", show_col_types = FALSE) # 提取基础标识、统计占比 result <- df %>% mutate( # 提取基础标识:仅移除末尾的" 1"后缀 base_id = str_remove(Value1, " 1$"), # 判断当前条目是否带" 1"后缀 has_suffix = str_detect(Value1, " 1$") ) %>% group_by(base_id) %>% summarise( total_count = n(), suffix_count = sum(has_suffix), ratio = suffix_count / total_count, # 可选:转换为百分比格式 ratio_percent = paste0(round(ratio * 100, 1), "%") ) %>% ungroup() %>% # 添加文件名,方便多文件结果区分 mutate(filename = path_file(file_path)) return(result) }
3. 批量处理目录下所有文件
指定目标目录,批量处理所有.txt文件并合并结果:
# 替换为你的实际文件目录路径 target_dir <- "/path/to/your/txt/files" # 获取目录下所有.txt文件的完整路径 txt_files <- dir_ls(target_dir, regexp = "\\.txt$") # 批量处理并合并所有结果 all_results <- map_dfr(txt_files, calculate_suffix_ratio) # 查看结果 print(all_results) # 可选:将结果保存为CSV文件 write_csv(all_results, "suffix_ratio_results.csv")
关键说明
- 如果你的文件是逗号分隔,将
read_delim中的delim = "\t"改为delim = ","; str_remove(Value1, " 1$")确保只移除末尾的" 1",避免误删标识本身包含的"1"字符;- 结果中的
filename列可以帮你对应到原始文件; ratio_percent列是可选的百分比格式,可根据需求删除或调整精度。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

