我有一个问题:如何transmute在不用手写每列的情况下使用每列?即,有类似的东西transmute_each()吗?
我想要执行以下操作:使用dplyr我想获得MWE的每列的z分数:
tickers <- c(rep(1,10),rep(2,10))
df <- data.frame(cbind(tickers,rep(1:20),rep(2:21),rep(2:21),rep(4:23),rep(3:22)))
colnames(df) <- c("tickers","col1","col2","col3","col4","col5")
df %>% group_by(tickers)
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以使用transmute来实现以下目的:
for(i in 2:ncol(df)){
df[,i] <- df[,i] - mean(df[,i])/sd(df[,i])
}
Run Code Online (Sandbox Code Playgroud)
非常感谢
现在有一个transmute_at()函数(从 dplyr 0.7 开始),您可以执行以下操作:
df %>%
group_by(tickers) %>%
transmute_at(.vars = vars(starts_with("col")),
.funs = funs(scale(.))) %>%
ungroup
Run Code Online (Sandbox Code Playgroud)
请注意,这使用了scale()来自基数 R的函数,默认情况下,该函数将数字向量转换为 z 分数。
此外,使用vars()中的.vars参数允许使用所有的辅助功能可用于dplyr的select(),如one_of(),ends_with()等。
最后,不要在funs(scale(.))这里写,因为你在.funs参数中使用了一个简单的函数,你可以只写.funs = scale.
我使用以下方法解决了这个问题:
df %>%
group_by(tickers) %>%
mutate_at(.funs = funs((. - mean(.))/sd(.)),
.cols = vars(matches("col")))
Run Code Online (Sandbox Code Playgroud)