如何统计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
相关产品推荐
相关产品推荐

