簡體   English   中英

將列名稱傳遞給mutate_each

[英]Pass column name to function from mutate_each

我想通過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(.)))

Works,但是有一些特殊的變量,如.name ,其中包含列名 對於每個colighte執行? 所以我可以做點什么

mtcars %>% mutate_each(funs(named.mult(.,.name)))

我建議采取不同的方法。 而不是使用mutate_eachdplyr::mutatetidyr::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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM