我有一个带有以下变量的数据框
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
}
是否有另一种不使用循环的解决方案?
我们可以将数据转换为长格式,然后加入
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)