基于列更新DataFrame:新增总分及预期分关联字段需求
处理百万级DataFrame的字段新增与条件填充
针对你的需求,这里提供两种高效处理百万级数据的实现方式,分别基于dplyr(tidyverse生态)和data.table,后者在大数据量下性能更优:
方式一:使用dplyr(tidyverse)
library(dplyr) # 加载示例数据 df <- data.frame(total_score=c(4.5,12.2,4.6,9.2,12.2,36.4), expected_score=c(4.5,12.1,NA,9.2,12.2,NA), Region1=c("All region",NA,NA,"All region","All region",NA), Region2=c("EAST","EAST","EAST","EAST","EAST",NA), Region3=c("West",NA,"West","West","West","West")) # 新增total_score和expected_score的对应字段 df_processed <- df %>% mutate( # 处理total_score关联字段 t_region1 = if_else(Region1 == "All region", total_score, NA_real_), t_region2 = if_else(Region1 == "All region", total_score, NA_real_), t_region3 = if_else(Region1 == "All region", total_score, NA_real_), # 处理expected_score关联字段 e_region1 = if_else(Region1 == "All region", expected_score, NA_real_), e_region2 = if_else(Region1 == "All region", expected_score, NA_real_), e_region3 = if_else(Region1 == "All region", expected_score, NA_real_) ) # 查看处理结果 print(df_processed)
方式二:使用data.table(大数据量首选)
library(data.table) # 转换为data.table格式 dt <- as.data.table(df) # 批量新增字段,利用data.table原地赋值语法 dt[Region1 == "All region", `:=`( t_region1 = total_score, t_region2 = total_score, t_region3 = total_score, e_region1 = expected_score, e_region2 = expected_score, e_region3 = expected_score )] # 非目标行的字段默认会是NA,若需要显式统一设置可补充: # dt[Region1 != "All region", `:=`(t_region1=NA_real_, t_region2=NA_real_, t_region3=NA_real_, e_region1=NA_real_, e_region2=NA_real_, e_region3=NA_real_)] # 查看处理结果 print(dt)
说明
- 两种方式均避免了逐行循环,适合百万级数据的高效处理
data.table的:=赋值是原地修改,内存占用更低、处理速度更快,更适合超大数据场景- 使用
NA_real_是为了保证字段类型统一(数值型),避免隐式类型转换引发的问题
内容的提问来源于stack exchange,提问作者samrr_tr
相关产品推荐
相关产品推荐

