首页 > 解决方案 > 如何根据 R 中多个变量的标准差创建新数据框

问题描述

我想根据条件从现有数据框创建一个新的数据框“data.frame.final” - 例如,我的数据框中所有变量的 +/-3 标准偏差。

我有 5 个变量,我需要生成一个具有相同标准的新数据框,+/- 3 SD,应用于所有变量。

tt <- "id_animal farm protein fat casein lactose
1  AG   3.0  9.0  2.3 1.5
2  AG   3.0  9.7  3.3 1.3
3  FA   2.0  7.6  4.3 2.4
4  AB   1.5  6.9  5.4 2.8
5  AB   2.9  7.3  3.4 2.9"

dataframe1 <- read.table (text=tt, header=T)

data.frame.final我只想要每个变量在 +/- 3 SD 内的值。对于低于或高于 3 SD 的值,我想插入“NA”。

标签: r

解决方案


您的示例数据中没有任何值与平均值相差超过 3 个标准差。这是一个修改后的例子

tx <- "id_animal farm protein fat casein lactose
1  AG   3.0  9.0  2.3 1.5
2  AG   3.0  910.7  3.3 1.3
3  FA   2.0  7.6  4.3 25.4
4  AB   1.5  6.9  555.4 2.8
5  AB   220.9  7.3  3.4 2.9"

df <- read.table (text=tx, header=T)

df

#   id_animal farm protein   fat casein lactose
# 1         1   AG     3.0   9.0    2.3     1.5
# 2         2   AG     3.0 910.7    3.3     1.3
# 3         3   FA     2.0   7.6    4.3    25.4
# 4         4   AB     1.5   6.9  555.4     2.8
# 5         5   AB   220.9   7.3    3.4     2.9

实际上,仍然没有超过平均值 3 个标准差的值。我将使用 1 个标准差。改变n_sds以控制这一点。

对于除前两列之外的所有列,replace所有值 not( !)between这两个值由 给出mean(.) + c(-1, 1)*n_sds*sd(.),即均值减n_sds*sd(.)和均值加n_sds*sd(.),其中NA

library(dplyr)

n_sds <- 1

df %>% 
  mutate_at(-(1:2), ~ {
    rng <- mean(.) + c(-1, 1)*n_sds*sd(.)
    replace(., !between(., rng[1], rng[2]), NA)
  })
#   id_animal farm protein fat casein lactose
# 1         1   AG     3.0 9.0    2.3     1.5
# 2         2   AG     3.0  NA    3.3     1.3
# 3         3   FA     2.0 7.6    4.3      NA
# 4         4   AB     1.5 6.9     NA     2.8
# 5         5   AB      NA 7.3    3.4     2.9

推荐阅读