【问题标题】:r: Programatically Normalize & Name Variablesr:以编程方式规范化和命名变量
【发布时间】:2018-12-12 22:39:12
【问题描述】:

我有一个包含两个变量的数据集:

df<- data.frame(var1= rnorm(20, 15, 1.5), var2= rnorm(20, 7.5, 1))

我有一个函数可以用来标准化它们:

normFunc<- function(x){
  xAvg<- mean(x)
  return(x/xAvg)
}

手动运行该功能可以正常工作,请参阅下面的var1

df$var1AVG<- normFunc(df$var1)

我想做的是动态地将两个变量传递给函数,使用for循环,将它们分配给数据框并动态命名它们。

【问题讨论】:

  • 如果您不介意名称中的下划线dplyr,您可以使用df %&gt;% mutate_all(funs(AVG=normFunc))
  • 你熟悉lapply吗?听起来像是它的完美用例
  • 试试df[, paste0(names(df), "AVG")] &lt;- lapply(df, normFunc)

标签: r function for-loop


【解决方案1】:

您可以使用colMeans/colMeans2 以矢量化方式执行此操作

df / colMeans(df)
# or
df / matrixStats::colMeans2(as.matrix(df))
# yields
     var1      var2
1  0.9307705 0.4228236
2  1.9674104 0.9776180
3  1.1397295 0.4255726
4  2.0279614 0.9090271
5  0.9987836 0.4519303
...

有数据

set.seed(123)
df <- data.frame(var1= rnorm(20, 15, 1.5), var2= rnorm(20, 7.5, 1))

附录

解决您的问题:

或者,在这种情况下,Vectorize 方法或apply 系列(vapply 是迄今为止最有效的方法)值得一试 - 在您的情况下,vapply(1:ncol(df), function (n) normFunc(df[,n]), numeric(nrow(df))) 会起作用。或者一个结构良好的循环有时可以更快。

【讨论】:

  • 谢谢,这很有帮助,但我的问题不是关于规范化,而是关于如何以编程方式应用我的函数来生成规范化变量。
  • @enriqueStateSpacias 很公平,我会编辑我的答案
猜你喜欢
  • 2010-09-12
  • 2021-12-20
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多