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

如何统计R语言矩阵中每行元素的出现频率?

## 更新说明
若矩阵包含NA值(例如执行`mmm[2,1] <- NA`),需统计NA的出现次数,示例输出如下:
```r
table(base[row(mmm)], mmm, useNA="ifany")
#   mmm
#    a b c <NA>
#  a 2 3 0    0
#  b 2 2 0    1
#  c 1 1 3    0
#  d 1 1 3    0

解决方案

1. 生成频次矩阵

结合apply与table函数,将每行元素的频次统计结果整理为目标矩阵:

set.seed(1)
base <- letters[1:4]
mmm <- matrix(sample(base, size=20, replace=TRUE), nrow=4)

# 按行统计各元素出现次数,强制包含base所有类别
freq_list <- apply(mmm, 1, function(x) table(factor(x, levels = base)))
# 转置结果并设置行列名
freq_matrix <- t(freq_list)
rownames(freq_matrix) <- base
colnames(freq_matrix) <- base

print(freq_matrix)
#   a b c d
# a 2 3 0 0
# b 2 2 0 1
# c 1 1 3 0
# d 1 1 3 0

2. 生成三元组列表

通过基础R的reshape函数将矩阵转换为三元组格式:

# 将频次矩阵转为数据框
freq_df <- as.data.frame(freq_matrix)
freq_df$行索引 <- rownames(freq_df)
# 重塑为长格式并筛选出计数大于0的记录
triples <- reshape(freq_df, direction = "long", 
                   varying = colnames(freq_df), 
                   v.names = "计数", timevar = "列索引", 
                   times = colnames(freq_df))
triples <- triples[triples$计数 > 0, c("行索引", "列索引", "计数")]

# 输出为逗号分隔的三元组
write.table(triples, sep = ",", row.names = FALSE, col.names = FALSE)
# 输出示例:
# a,a,2
# b,a,2
# c,a,1
# d,a,1
# a,b,3
# b,b,2
# c,b,1
# d,b,1
# c,c,3
# d,c,3
# b,d,1

3. 处理含NA值的场景

直接使用table函数并指定useNA="ifany"参数,即可统计NA的出现次数:

# 插入NA值
mmm[2,1] <- NA
# 生成包含NA的频次表
na_freq_table <- table(base[row(mmm)], mmm, useNA="ifany")
print(na_freq_table)
#   mmm
#    a b c <NA>
#  a 2 3 0    0
#  b 2 2 0    1
#  c 1 1 3    0
#  d 1 1 3    0

内容的提问来源于stack exchange,提问作者clp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:07:22