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

如何统计数据框中各值至少出现一次的行数(R语言)

解决方案

Base R 实现

核心思路:先逐行判定每个值是否存在,再统计每个值覆盖的行数,全程用向量化操作避免低效循环。

# 原始数据框
df <- data.frame(col1 = c("value_1", "value_2", "value_3"),
                 col2 = c("value_2", "value_2", "value_4"),
                 col3 = c("value_1", "value_3", "value_3")
)

# 提取所有唯一值
all_values <- unique(unlist(df))

# 逐行检查每个值的存在性,统计总行数
count_result <- colSums(sapply(all_values, function(x) apply(df, 1, function(row) x %in% row)))

# 转换为目标数据框格式
df_out_base <- as.data.frame(t(count_result))

运行后得到的结果:

> df_out_base
  value_1 value_2 value_3 value_4
1       1       2       2       1

Tidyverse 实现

核心思路:通过数据格式转换,用分组去重确保每行仅统计一次,再高效聚合计数。

library(tidyverse)

# 原始数据框
df <- data.frame(col1 = c("value_1", "value_2", "value_3"),
                 col2 = c("value_2", "value_2", "value_4"),
                 col3 = c("value_1", "value_3", "value_3")
)

df_out_tidy <- df %>%
  # 添加行号用于分组标记
  mutate(row_id = row_number()) %>%
  # 宽格式转长格式,统一值的存储结构
  pivot_longer(-row_id, names_to = "col", values_to = "value") %>%
  # 按行+值去重,避免同一行的重复值多次计数
  distinct(row_id, value) %>%
  # 统计每个值对应的行数
  count(value) %>%
  # 长格式转回宽格式,匹配目标输出结构
  pivot_wider(names_from = value, values_from = n, values_fill = 0) %>%
  # 转换为标准数据框
  as.data.frame()

运行后得到的结果:

> df_out_tidy
  value_1 value_2 value_3 value_4
1       1       2       2       1

两种方法均采用向量化/批量操作逻辑,避免了ifelse()这类低效的分支判断,适合处理大规模数据场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:12:10