You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算并替换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 4
  • mean(.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为例:

  1. 先计算其整体均值:mean(df$Type 1, na.rm = TRUE),结果为0.42
  2. 原数据中2020-10-01的Type 1值为0.3,替换后的偏差为0.3 - 0.42 = -0.12,可在结果数据框中对应位置验证。

内容的提问来源于stack exchange,提问作者alec22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:05:41