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

如何统计DataFrame每行中'-'、'+'、'0'的元素数量?

解决每行统计指定符号数量的问题

嗨,我明白你的需求啦——你想对每行分别统计-、+、0这三个符号的数量,哪怕某个符号在该行没出现(比如最后一行的-和0)也要显示计数为0,而直接用table(mydata)要么是统计整个数据集的频率,要么逐行统计时会漏掉没出现的类别。我给你两种实用的方法:

方法一:基础R的apply函数(无需额外包)

这种方法适合习惯用基础R的同学,核心思路是把每行的元素转成指定了固定类别的因子(factor),这样table()就会强制输出所有指定的类别,哪怕计数为0:

# 先模拟你的数据(如果你的数据已经是矩阵/数据框可以跳过这步)
mydata <- matrix(c("-", "-", "-", "-", "+", "+", "-", "-", "+", "-", "0", "-", "0",
                   "-", "+", "-", "+", "-", "-", "-", "-", "+", "+", "-", "+", NA,
                   "+", rep(NA, 12)), nrow=3, byrow=TRUE)

# 逐行统计三个符号的数量
row_counts <- t(apply(mydata, 1, function(row) {
  # 先去掉该行的NA值(如果不需要忽略NA可以删掉这步)
  clean_row <- row[!is.na(row)]
  # 把元素转成因子,指定必须包含的三个类别
  factor_row <- factor(clean_row, levels = c("-", "+", "0"))
  # 生成统计表
  table(factor_row)
}))

# 查看结果
row_counts

运行后你会得到一个3行3列的矩阵,每行对应原数据的一行,列分别是-、+、0的计数,没出现的符号会显示0,完全符合你的需求。

方法二:tidyverse风格(更适合数据框操作)

如果你习惯用tidyverse工具链(dplyr、tidyr),可以用长格式转换的思路来实现,代码更直观:

library(tidyverse)

# 把矩阵转成带行号的数据框
mydata_df <- as.data.frame(mydata) %>%
  mutate(row_id = row_number())

# 转换为长格式、统计计数、再转回宽格式补全0
row_counts_df <- mydata_df %>%
  pivot_longer(-row_id, values_to = "symbol") %>% # 宽转长
  filter(!is.na(symbol)) %>% # 过滤NA值
  mutate(symbol = factor(symbol, levels = c("-", "+", "0"))) %>% # 指定固定类别
  count(row_id, symbol) %>% # 按行和符号计数
  pivot_wider(names_from = symbol, values_from = n, values_fill = 0) # 长转宽,补全0

# 查看结果
row_counts_df

这个方法会生成一个数据框,row_id对应原数据的行号,后面三列是三个符号的计数,同样会显示0值。

为什么直接用table(mydata)不行?

  • 直接对整个数据集用table()是统计所有元素的频率,不是按行统计;
  • 哪怕你逐行用table(row),默认只会统计该行中实际出现过的类别,没出现的会被省略,所以最后一行只会显示+的计数,而不会显示-和0的0值。通过指定因子的levels,就能强制让table()输出我们关心的所有类别啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:28:08