在dplyr中转换多个列

时间:2015-09-23 11:42:24

标签: 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)

是否有一种简单的方法可以使用transmute来实现以下目的:

for(i in 2:ncol(df)){
  df[,i] <- df[,i] - mean(df[,i])/sd(df[,i])
}

非常感谢

2 个答案:

答案 0 :(得分:3)

现在有一个public int printTreeInOrder(Node node, int k){ //in-order printing (sorted) if (k>0 && !(isNull(node))){ k = printTreeInOrder(node.getLeft(),k); if (k>0) { System.out.println(node.getValue()); k--; } return printTreeInOrder(node.getRight(),k); } return k; } 函数(从dplyr 0.7开始),你可以执行以下操作:

transmute_at()

请注意,这使用了基础R中的df %>% group_by(tickers) %>% transmute_at(.vars = vars(starts_with("col")), .funs = funs(scale(.))) %>% ungroup 函数,默认情况下会将数字向量转换为z得分。

此外,在scale()参数中使用vars()允许您使用dplyr .vars可用的所有辅助函数,例如select() },one_of()

最后,不要在此处写ends_with(),因为您在funs(scale(.))参数中使用了一个简单函数,您只需编写.funs

答案 1 :(得分:0)

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

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