操纵数据框列的子集的值

时间:2018-10-11 08:32:43

标签: r

我想标准化数据框中的许多列,但不是所有列。在向量中指定要操作的列。

为说明,请采用以下模拟数据框:

set.seed(1)
mydf <- data.frame(matrix(sample(100, 36, replace = TRUE), nrow = 12))

定义要操作的两列(请注意,解决方案应适用于按其名称而不是其数据帧编号定义的列的子集):

variables <- c("X1", "X2")

现在,我编写了以下循环来标准化两列,这使我出错。

for (i in seq_along(variables)) {
  mydf[variables[i]] <- ((mydf[variables[i]] - mean(mydf[variables[i]], na.rm = TRUE)) / sd(mydf[variables[i]], na.rm = TRUE))
}

正确的方法是什么? (我是R的初学者。)

3 个答案:

答案 0 :(得分:2)

您可以使用scale,并且不需要循环:

mydf[variables] <- scale(mydf[variables])

答案 1 :(得分:0)

mlr软件包中的

标准化功能将为您提供帮助。

set.seed(1)
mydf <- data.frame(matrix(sample(100, 36, replace = TRUE), nrow = 12))

colnames(mydf)
library(mlr)
trainTask <- normalizeFeatures(mydf[c( "X1","X2" )],method = "standardize")

答案 2 :(得分:0)

要使循环正常工作,请使用[[而不是[,因为meansd需要一个向量。

for (i in seq_along(variables)) {
  mydf[variables[i]] <-
    ((mydf[variables[i]] - mean(mydf[[variables[i]]], na.rm = TRUE)) / sd(mydf[[variables[i]]], na.rm = TRUE))
}

但是考虑使用scale,请参阅@SvenHohenstein的答案。