如何依据A列字符串值计算列值差并在tibble中生成novig_new列?
问题1:根据A列字符串值对B列数值执行减法运算
假设你用tidyverse工具集,核心思路是先按A列分组,再根据你的具体减法逻辑处理B列数值,以下是两种常见场景的实现代码:
- 场景1:以A列中某特定字符串对应的B值为基准,组内其他B值减去该基准值
library(tidyverse) # 示例数据集 df <- tibble( A = c("基准组", "分组1", "分组1", "分组2", "分组2"), B = c(10, 15, 12, 8, 9) ) # 执行减法:每组B值减去该组A为"基准组"的B值 df <- df %>% group_by(str_extract(A, "^.*组")) %>% mutate(B_subtracted = B - B[A == "基准组"]) %>% ungroup()
- 场景2:A列是明确的操作指令(比如"减5""减10"),按指令对B列做减法
df <- df %>% mutate(B_subtracted = case_when( A == "减5" ~ B - 5, A == "减10" ~ B - 10, TRUE ~ B # 无匹配指令时保持原数值 ))
问题2:创建novig_new列(其他博彩公司novig_prob减去Pinnacle的对应值)
核心是先提取每个球队对应的Pinnacle博彩公司novig_prob作为基准,再按球队匹配计算差值,代码如下:
library(tidyverse) # 假设你的数据集名为df,包含team(球队)、bookmaker(博彩公司)、novig_prob列 # 方法1:分组直接计算 df <- df %>% group_by(team) %>% # 提取每组Pinnacle的novig_prob作为基准 mutate(pinnacle_base = novig_prob[bookmaker == "Pinnacle"]) %>% # 计算novig_new,Pinnacle自身设为0(可按需改为NA) mutate(novig_new = ifelse(bookmaker != "Pinnacle", novig_prob - pinnacle_base, 0)) %>% ungroup() %>% select(-pinnacle_base) # 移除临时基准列 # 方法2:先提取基准表再左连接(适用于Pinnacle记录可能重复的情况) pinnacle_ref <- df %>% filter(bookmaker == "Pinnacle") %>% distinct(team, .keep_all = TRUE) %>% select(team, pinnacle_base = novig_prob) df <- df %>% left_join(pinnacle_ref, by = "team") %>% mutate(novig_new = novig_prob - pinnacle_base) %>% select(-pinnacle_base)
内容的提问来源于stack exchange,提问作者Aaron Morris
相关产品推荐
相关产品推荐

