在R中基于配对变量批量生成新变量并对指定列标准化的方法
R语言批量衍生变量与指定列标准化实现方案
以下方案基于tidyverse生态实现,全程不需要手动指定50组变量的完整名称,适配符合命名规则的任意数量配对变量。
前置准备
首先加载依赖包,导入示例数据:
# 加载依赖包 library(tidyverse) # 导入示例数据 df <- structure(list(Word_b = c("60", "70", "51", "73", "13", "60", "30"), Word_a = c("1", "10", "31", "30", "22", "5", "30"), Six_b = c("1", "3", "1", "0", "0", "0", "40"), Six_a = c("30", "50", "48", "41", "35", "0", "65"), Flute_b = c("1", "50", "52", "50", "45", "80", "30"), Flute_a = c("1", "10", "1", "0", "0", "0", "3"), VWordQ.13 = c(6.53, NA, 5.6, 5.6, 5.21, 5.44, 6), VSixQ.22 = c(5.14, NA, 5.95, 3.25, 3.24, 3, 3), VFluteQ.7 = c(6.68, NA, 5.6, 6.68, 6.92, NA, 6.68)), row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame"))
步骤1:批量生成[word]_c衍生变量
先自动识别所有[word]_a/[word]_b的配对变量前缀,统一将字符型的a/b列转换为数值型,再批量计算差值生成_c列:
# 自动提取所有配对变量的共同前缀 stems <- str_subset(names(df), "_a$") %>% str_remove("_a$") # 转换数据类型并批量生成_c列 df <- df %>% mutate(across(matches("_[ab]$"), as.numeric)) %>% mutate(!!!map_dfc(stems, ~tibble(!!paste0(.x, "_c") := .data[[paste0(.x, "_a")]] - .data[[paste0(.x, "_b")]])))
运行后即可得到要求的中间结构,所有原列保留,新增对应_c列。
步骤2:标准化指定列
自动匹配所有_c结尾的列和符合V[word]Q.[number]格式的列,执行标准化处理,这里提供两种常用标准化方案可选:
# 识别需要标准化的列 std_cols <- str_subset(names(df), "_c$|^V.*Q\\.[0-9]+$") # 方案1:Z-score标准化(均值为0,标准差为1,适合正态分布数据对比) df_result <- df %>% mutate(across(all_of(std_cols), ~(.x - mean(.x, na.rm = TRUE))/sd(.x, na.rm = TRUE), .names = "{.col}_std")) # 方案2:0-1归一化(所有值映射到0-1区间,适合不同取值范围数据直接对比) # df_result <- df %>% # mutate(across(all_of(std_cols), ~(.x - min(.x, na.rm = TRUE))/(max(.x, na.rm = TRUE) - min(.x, na.rm = TRUE)), .names = "{.col}_std"))
标准化后的列会以原列名_std的后缀新增,不覆盖原始数据,方便后续校验。
内容的提问来源于stack exchange,提问作者user13343754
相关产品推荐
相关产品推荐

