r - 将列名传递给 mutate_each 的函数

标签 r dplyr

我想通过 dplyr::mutate_each 对所有列应用转换,例如

library(dplyr)
mult <- function(x,m) return(x*m)
mtcars %>% mutate_each(funs(mult(.,2)))    # Multiply all columns by a factor of two

但是,转换应该具有取决于列名称的参数。因此,列名应该作为附加参数传递给函数
named.mult <- function(x,colname) return(x*param.A[[colname]])

示例:将每一列乘以不同的因子:
param.A <- c()
param.A[names(mtcars)] <- seq(length(names(mtcars)))
param.A
# mpg  cyl disp   hp drat   wt qsec   vs   am gear carb 
#   1    2    3    4    5    6    7    8    9   10   11 

由于列名在 mutate_each 期间丢失,我目前通过将具有延迟评估的列表传递给 mutate_(SE 版本)来解决此问题:
library(lazyeval)
named.mutate <- function(fun, cols) sapply(cols, function(n) interp(~fun(col, n), fun=fun, col=as.name(n)))
mtcars %>% mutate_(.dots=named.mutate(named.mult, names(.)))

有效,但是否有一些特殊变量,如 .name 包含 .对于每个 colwise 执行?所以我可以做类似的事情
mtcars %>% mutate_each(funs(named.mult(.,.name)))

最佳答案

我建议采取不同的方法。而不是使用 mutate_each dplyr::mutate的组合与 tidyr::gathertidyr::spread可以达到相同的结果。

例如:

library(dplyr)
library(tidyr)

data(mtcars)

# Multiple each column by a different interger
mtcars %>% 
  dplyr::tbl_df() %>%
  dplyr::mutate(make_and_model = rownames(mtcars)) %>%
  tidyr::gather(key, value, -make_and_model) %>% 
  dplyr::mutate(m = as.integer(factor(key)),   # a multiplication factor dependent on column name
                value = value * m) %>% 
  dplyr::select(-m) %>%
  tidyr::spread(key, value)

# compare to the original data
mtcars[order(rownames(mtcars)), order(names(mtcars))]

# the muliplicative values used.
mtcars %>% 
  tidyr::gather() %>% 
  dplyr::mutate(m = as.integer(factor(key))) %>% 
  dplyr::select(-value) %>%
  dplyr::distinct()

关于r - 将列名传递给 mutate_each 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33282054/

相关文章:

r - 将数据表减去数据的子集

r - 在向量上映射一个函数

r - 使用 plot_ly 抑制工具提示中的默认文本

r - 我可以使用R属性来保存物理单位吗?

r - 如何对 R 中管道序列中的列选择应用函数?

R:根据现有数据帧上的多个条件添加数据列和行

r - 在数据框中使用 NA 压缩行 (R)

r - 插入符序列不输出进度

r - 带有先前计算值的箱线图

r - 如何在变量上使用 base::scale() 和 dplyr::filter()