R语言中按列前缀分组统计不同观测值频率占比
问题描述
现有R数据框如下:
position 10164.0 10164.1 10192.0 10192.1 10316.0 10316.1 10349.0 10349.1 10418.0 10418.1 4414 1 1 1 1 1 1 1 1 1 1 5295 1 1 1 1 1 1 1 1 1 1 5738 1 1 1 1 1 1 1 1 1 1 5785 1 1 1 1 1 1 1 1 1 1 6392 1 1 1 1 1 1 1 1 1 1 7727 1 1 1 2 1 1 1 1 1 1 8876 1 1 1 2 1 1 1 1 1 1 9018 1 1 1 2 1 0 1 1 1 1 9208 0 1 1 2 1 0 1 2 1 1 9627 0 1 1 2 1 0 1 2 0 1
从第二列开始,列名带有.0或.1后缀,需完成以下操作:
- 统计
position列的观测数并乘以2(本例结果为20); - 对每个前缀相同的列组(如
10164.0与10164.1),统计值为0、1、2的观测数量,再除以总观测数(position观测数×2)得到占比。
当前编写的R代码如下:
df = read.table(file = 'df.tsv', sep = '\t', header = TRUE) df2 = sapply(df, function(x) table(factor(x, levels = c("0", "1", "2")))) write.table(df2, file='df2.tsv', quote=FALSE, sep='\t')
该代码输出结果不符合预期,期望得到的格式如下:
observations 0 1 2 X10164 0.1000 0.9000 0.0000 X10192 0.0000 0.7500 0.2500 X10316 0.1500 0.8500 0.0000 X10349 0.0000 0.9000 0.1000 X10418 0.0500 0.9500 0.0000
解决方案
修正后的R代码如下:
# 读取数据 df <- read.table(file = 'df.tsv', sep = '\t', header = TRUE) # 计算总观测数:position行数×2 total_obs <- nrow(df) * 2 # 提取除position外的列名,拆分前缀(移除.0/.1后缀) cols <- colnames(df)[-1] prefixes <- unique(sub("\\.[01]$", "", cols)) # 遍历每个前缀,计算占比 result_list <- lapply(prefixes, function(prefix) { # 提取当前前缀对应的两列 group_cols <- cols[grepl(paste0("^", prefix, "\\.[01]$"), cols)] # 合并两列数据为单个向量 combined_data <- unlist(df[, group_cols]) # 统计0、1、2的数量,强制保留三个水平避免错位 count_table <- table(factor(combined_data, levels = c(0, 1, 2))) # 计算占比并保留4位小数 prop_table <- round(count_table / total_obs, 4) return(prop_table) }) # 转换为数据框并整理格式 result_df <- do.call(rbind, result_list) rownames(result_df) <- paste0("X", prefixes) colnames(result_df) <- c("0", "1", "2") result_df <- cbind(observations = rownames(result_df), result_df) rownames(result_df) <- NULL # 输出到文件 write.table(result_df, file='result.tsv', quote=FALSE, sep='\t', row.names=FALSE)
代码说明
- 前缀分组:通过正则表达式移除列名的
.0/.1后缀,提取唯一前缀实现列组划分; - 数据合并:将同前缀的两列数据合并为一个向量,确保统计的是整个组的观测数;
- 占比计算:用
factor强制保留0、1、2三个水平,避免因某个水平缺失导致结果错位,再除以总观测数得到占比; - 格式适配:将结果转换为数据框,设置行名和列名,完全匹配期望的输出格式。
内容的提问来源于stack exchange,提问作者guidebortoli
相关产品推荐
相关产品推荐

