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

在R语言中统计dataframe指定列内目标值出现次数并生成结果列

在R中统计每行指定值在目标列的出现次数并新增结果列

原始数据与需求

原始R代码

VAL1 <- c(1,3,2,4,9)
VAL2 <- c(5,6,3,1,2)
VAL3 <- c(7,5,5,9,5)
T1   <- c(4,2,6,4,8)
T2   <- c(10,1,2,9,9)
T3   <- c(6,8,6,3,2)
T4   <- c(5,4,2,4,1)
T5   <- c(9,7,8,4,5)

df <- data.frame(VAL1,VAL2,VAL3,T1,T2,T3,T4,T5)

原始数据结构

VAL1VAL2VAL3T1T2T3T4T5
157410659
36521847
23562628
41949344
92589215

需求说明

需要在上述数据框中新增RESULT1、RESULT2、RESULT3三列:

  • RESULT1:统计每行VAL1的值在T1-T5列中的出现次数
  • RESULT2:统计每行VAL2的值在T1-T5列中的出现次数
  • RESULT3:统计每行VAL3的值在T1-T5列中的出现次数

期望输出

VAL1VAL2VAL3T1T2T3T4T5RESULT1RESULT2RESULT3
157410659010
36521847000
23562628200
41949344301
92589215111

解决方案

方法1:Base R 实现

无需额外安装包,使用apply逐行处理:

# 获取所有以T开头的列索引
t_cols <- grep("^T", names(df))

# 新增结果列
df$RESULT1 <- apply(df, 1, function(row) sum(row[t_cols] == row["VAL1"]))
df$RESULT2 <- apply(df, 1, function(row) sum(row[t_cols] == row["VAL2"]))
df$RESULT3 <- apply(df, 1, function(row) sum(row[t_cols] == row["VAL3"]))

方法2:tidyverse(dplyr)实现

适合熟悉tidyverse生态的用户,代码更简洁直观:

library(dplyr)

df <- df %>%
  rowwise() %>%  # 按行处理
  mutate(
    RESULT1 = sum(c_across(starts_with("T")) == VAL1),
    RESULT2 = sum(c_across(starts_with("T")) == VAL2),
    RESULT3 = sum(c_across(starts_with("T")) == VAL3)
  ) %>%
  ungroup()  # 取消按行分组

两种方法都能得到符合期望的结果,可根据自己的代码习惯选择。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:34:53