You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:50:53