我最近从R中的常见数据帧操作转移到了tidyverse。但是我在使用scale()
函数缩放列时遇到了问题。
我的数据由列组成,其中一些是数字和一些分类特征。最后一列也是数据的y值。所以我想缩放所有数字列但不是最后一列。
使用select()
函数,我能够编写一个非常短的代码行,并选择我需要缩放的所有数值列,如果我添加ends_with("...")
参数。但我无法通过缩放来实现这一点。在那里,我必须使用transmute(feature1=scale(feature1),feature2=scale(feature2)...)
并单独命名每个功能。这工作正常,但代码膨胀。
所以我的问题是:
是否存在逐列操作的智能解决方案,而无需使用每个列名称 蜕变?
我想象的是:
transmute(ends_with("...")=scale(ends_with("..."),featureX,featureZ)
(知道这不起作用)
非常感谢提前
答案 0 :(得分:2)
library(tidyverse)
data("economics")
# add variables that are not numeric
economics[7:9] <- sample(LETTERS[1:10], size = dim(economics)[1], replace = TRUE)
# add a 'y' column (for illustration)
set.seed(1)
economics$y <- rnorm(n = dim(economics)[1])
economics_modified <- economics %>%
select(-y) %>%
transmute_if(is.numeric, scale) %>%
add_column(y = economics$y)
如果您希望将那些不是数字的列替换为transmute_if
modify_if
。 (可能有一种更明智的方法可以排除列y
的缩放。)