【问题标题】:Manipulate values of a subset of dataframe columns [duplicate]操作数据框列子集的值[重复]
【发布时间】:2019-03-16 06:37:28
【问题描述】:

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

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

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 的初学者。)

【问题讨论】:

    标签: r


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      要使您的循环正常工作,请使用[[ 而不是[,因为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 的回答。

      【讨论】:

      • 感谢您的澄清。我同意使用scale 是最直接的。
      【解决方案3】:

      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")
      

      【讨论】:

      • 非常优雅,但是,该解决方案需要应用于列名(而不是它们的数据框位置)已知的列子集。我的问题不清楚这一点,因此我进行了相应的编辑。
      • 使用特定列名更新了解决方案
      • 跟进我之前的评论,在你的最后一行代码中将mydf[c(1,2)] 替换为mydf[variables] 就是我想要的。
      • 您只需将其更改为没什么大不了的变量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2016-06-01
      • 2019-09-06
      • 1970-01-01
      • 2014-10-07
      • 2021-09-15
      • 2015-10-04
      相关资源
      最近更新 更多