使用另一个数据框缩放数据框中的变量

问题描述 投票:0回答:1

我有一个带有以下变量的数据框

dat <- data.frame(cell.ID = 1:10, cell.name = letters[1:10], 
              groupID = rep(1:2, each = 5), 
              x1 = rnorm(10), x2 = rnorm(10), 
              x3 = rnorm(10), x4= rnorm(10), 
              x5 = rnorm(10), x6 = rnorm(10))

我存储了平均值和sd以将x1标准化为另一个数据帧中的x6

norm_fin <- data.frame(variable = paste0('x',1:6), 
                   meanVar = rnorm(6),
                   SdVar = rnorm(6))

我想在将x1标准化为x6之后从dat创建一个新的数据框。我做了一个循环的解决方案

 varVec <- paste0('x',1:6)
 dat1 <- dat
 for(i in varVec){
  meanRef <- norm_fin$meanVar[norm_fin$variable == i]
  sdRef <- norm_fin$SdVar[norm_fin$variable == i]
  dat1[, i] <- (dat[, i] - meanRef)/sdRef
}

是否有另一种不使用循环的解决方案?

r standardized
1个回答
0
投票

我们可以将数据转换为长格式,然后加入

library(dplyr)
library(tidyr)

dat %>%
  pivot_longer(cols = starts_with('x')) %>%
  left_join(norm_fin, by = c('name' = 'variable')) %>%
  mutate(val = (value - meanVar)/SdVar) %>%
  select(-value, -meanVar, -SdVar) %>%
  pivot_wider(names_from = name, values_from = val)
© www.soinside.com 2019 - 2024. All rights reserved.