在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)
原始数据结构
| VAL1 | VAL2 | VAL3 | T1 | T2 | T3 | T4 | T5 |
|---|---|---|---|---|---|---|---|
| 1 | 5 | 7 | 4 | 10 | 6 | 5 | 9 |
| 3 | 6 | 5 | 2 | 1 | 8 | 4 | 7 |
| 2 | 3 | 5 | 6 | 2 | 6 | 2 | 8 |
| 4 | 1 | 9 | 4 | 9 | 3 | 4 | 4 |
| 9 | 2 | 5 | 8 | 9 | 2 | 1 | 5 |
需求说明
需要在上述数据框中新增RESULT1、RESULT2、RESULT3三列:
RESULT1:统计每行VAL1的值在T1-T5列中的出现次数RESULT2:统计每行VAL2的值在T1-T5列中的出现次数RESULT3:统计每行VAL3的值在T1-T5列中的出现次数
期望输出
| VAL1 | VAL2 | VAL3 | T1 | T2 | T3 | T4 | T5 | RESULT1 | RESULT2 | RESULT3 |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 5 | 7 | 4 | 10 | 6 | 5 | 9 | 0 | 1 | 0 |
| 3 | 6 | 5 | 2 | 1 | 8 | 4 | 7 | 0 | 0 | 0 |
| 2 | 3 | 5 | 6 | 2 | 6 | 2 | 8 | 2 | 0 | 0 |
| 4 | 1 | 9 | 4 | 9 | 3 | 4 | 4 | 3 | 0 | 1 |
| 9 | 2 | 5 | 8 | 9 | 2 | 1 | 5 | 1 | 1 | 1 |
解决方案
方法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
相关产品推荐
相关产品推荐

