如何统计data.frame各单元格分号分隔词频次并生成计数表(NA计为0)
问题描述
现有一个包含5803个观测值、23个变量的data.frame,部分数据如下:
| Clusters | Representative | Genome1 | Genome2 | GenomeX |
|---|---|---|---|---|
| 1 | Gene family 1 | Locus1;Locus2;Locus3 | Locus1;Locus2 | Locus1 |
| 2 | Gene family 1 | Locus2;Locus3 | Locus2;Locus3 | (空白) |
需要将其转换为计数表,统计每个单元格中以分号分隔的条目数量,空白/NA计为0,期望输出如下:
| Clusters | Representative | Genome1 | Genome2 | GenomeX |
|---|---|---|---|---|
| 1 | Gene family 1 | 3 | 2 | 1 |
| 2 | Gene family 1 | 2 | 2 | 0 |
解决方案(R语言)
针对这类分号分隔的计数需求,提供两种实现方式:
方法1:dplyr + stringr 简洁版
library(dplyr) library(stringr) # 假设数据框名为df,处理所有以Genome开头的列 df_count <- df %>% mutate(across(starts_with("Genome"), ~ ifelse(is.na(.) | . == "", 0, str_count(., ";") + 1)))
方法2:Base R 原生实现(无需额外包)
# 筛选出所有以Genome命名的列 genome_cols <- grep("^Genome", names(df), value = TRUE) # 批量处理每一列:空白/NA设为0,非空值统计分号分隔的条目数 df[genome_cols] <- lapply(df[genome_cols], function(x) { ifelse(is.na(x) | x == "", 0, lengths(strsplit(x, ";"))) })
逻辑说明
- 空白或NA值直接替换为0;
- 非空单元格中,分号的数量比条目数少1,所以用
分号数量+1或者strsplit后取长度来得到条目总数。
内容的提问来源于stack exchange,提问作者sdas
相关产品推荐
相关产品推荐

