在dplyr中转换多个列

Nic*_*ick 6 r dplyr

我有一个问题:如何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)

非常感谢

bsc*_*idr 5

现在有一个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.


Nic*_*ick 1

我使用以下方法解决了这个问题:

df %>%  
   group_by(tickers) %>%  
   mutate_at(.funs = funs((. - mean(.))/sd(.)),
             .cols = vars(matches("col")))
Run Code Online (Sandbox Code Playgroud)

  • 请注意,对于假设的“transmute_each”函数来说,这不是一个特别好的用例,因为所有列(除了无法删除的分组列)都满足您的选择标准(“matches("col")”)。这意味着,在这种情况下,“transmute_each”将与“mutate_each”执行相同的操作。 (3认同)