如何计算并替换R数据框中各类型数值与类型均值的偏差?
问题描述
现有如下R语言数据框df(包含日期列Date及4个带缺失值的数值列Type 1至Type 4):
structure(list(Date = structure(c(18605, 18604, 18598, 18597, 18590, 18584, 18583, 18578, 18570, 18569, 18563, 18562, 18557, 18549, 18548, 18542, 18541, 18536, 18534, 18529, 18521, 18520, 18515, 18508, 18500, 18499, 18493, 18492, 18486, 18485, 18479, 18478, 18472, 18471, 18465, 18464, 18458, 18457, 18450, 18445, 18444, 18437, 18436, 18430, 18429, 18424, 18416, 18415, 18410, 18409, 18403, 18402, 18396, 18388, 18387, 18381, 18380, 18374, 18373, 18368, 18367, 18360, 18359, 18354, 18340, 18338, 18331, 18325, 18317, 18312, 18289, 18282, 18275, 18268), class = "Date"), `Type 1` = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0.3, NA, NA, NA, NA, 0.4, NA, NA, NA, NA, 0.2, NA, NA, NA, NA, 0.7, NA, NA, NA, NA, NA, 0.5, NA, NA, NA, NA, 0.3, NA, NA, NA, NA, NA, 0.4, NA, NA, NA, 0.3, NA, NA, NA, NA, NA, NA, NA, NA, 0.6, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), `Type 2` = c(NA, NA, 0.1, NA, NA, 0.1, NA, 0.2, NA, 0.2, 0.1, NA, 0.2, 0.2, NA, 0.1, NA, NA, 0.1, NA, 0.2, NA, NA, 0.4, 0.2, NA, 0.3, NA, 0.2, NA, 0.3, NA, 0.6, NA, 0.4, NA, NA, 0.2, NA, 0.4, 0.6, NA, 0.3, NA, 0.2, 0.7, NA, 0.1, 0.3, NA, 0.2, NA, NA, NA, 0.3, NA, 0.1, 0.3, NA, NA, 0.3, 0.2, NA, NA, NA, NA, 0.6, NA, 0.4, NA, 0.2, NA, NA, 0.2), `Type 3` = c(NA, 0.3, NA, 0.3, 0.4, NA, 0.2, NA, 0.3, NA, NA, 0.2, NA, NA, 0.2, NA, 0.2, NA, NA, 0.1, NA, 0.2, NA, NA, NA, 0.3, NA, NA, NA, 0.4, NA, 0.3, NA, 0.7, NA, 0.2, 0.5, 0.4, NA, 0.4, NA, 0.8, 0.4, NA, 0.2, 0.6, 0.3, 0.2, NA, NA, NA, 0.4, 0.4, NA, 0.2, 0.3, NA, 0.2, 0.3, 0.4, NA, 0.7, NA, NA, 1.4, NA, NA, 1.4, NA, 1, NA, NA, 0.3, NA), `Type 4` = c(NA, 0.4, NA, 0.1, 0.1, NA, 0.1, NA, NA, 0.1, NA, 0.1, 0.2, NA, 0.2, NA, 0.2, 0.3, NA, NA, NA, 0.2, 0.3, 0.3, NA, NA, NA, 0.5, NA, 0.6, NA, 0.7, NA, NA, NA, 1.2, 1, NA, 0.3, NA, 1.1, NA, NA, 0.4, NA, NA, NA, NA, 0.2, 0.2, NA, NA, 0.2, NA, NA, 0.1, NA, NA, NA, 0.2, 0.3, NA, 0.2, 0.3, NA, 1.8, NA, NA, NA, NA, NA, 0.2, NA, NA)), row.names = c(NA, -74L), class = c("tbl_df", "tbl", "data.frame"))
需求:计算每个Type列的整体均值(忽略缺失值),将原列中的非缺失值替换为原数值 - 对应列均值的偏差值,同时保留Date列不变。
解决方案
完全可以实现,以下提供两种常用方法:
方法1:使用dplyr(tidyverse生态)
利用mutate()结合across()批量处理所有Type列,代码简洁高效:
library(dplyr) # 计算偏差并替换原列 df_deviations <- df %>% mutate(across(starts_with("Type"), ~ .x - mean(.x, na.rm = TRUE)))
starts_with("Type"):匹配所有以Type开头的列,自动选中Type 1至Type 4mean(.x, na.rm = TRUE):计算当前列的均值,忽略NA值.x - mean(...):将每个元素替换为与列均值的偏差
方法2:使用Base R
无需额外包,通过基础函数实现:
# 提取所有Type列的索引 type_cols <- grep("^Type", names(df)) # 计算每个Type列的均值(忽略NA) type_means <- sapply(df[type_cols], mean, na.rm = TRUE) # 计算偏差并替换原列 df_deviations_base <- df df_deviations_base[type_cols] <- df[type_cols] - type_means
grep("^Type", names(df)):筛选列名以Type开头的列索引sapply(...):批量计算各列均值- 直接通过矩阵运算完成偏差计算,保留Date列不变
验证示例
以Type 1为例:
- 先计算其整体均值:
mean(df$Type 1, na.rm = TRUE),结果为0.42 - 原数据中2020-10-01的
Type 1值为0.3,替换后的偏差为0.3 - 0.42 = -0.12,可在结果数据框中对应位置验证。
内容的提问来源于stack exchange,提问作者alec22
相关产品推荐
相关产品推荐

