2015-10-22 13 views
6

dplyr :: mutate_eachですべての列に変換を適用したいと思います。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]]) 

例:列名がmutate_each中に失われるので、

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_(SE版)に渡すことで、この問題を回避しています。(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のような特別な変数があり、列名はです。各列ごとの実行について?だから、私は何かをすることができる

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

答えて

0

私は別のアプローチをとることをお勧めします。 mutate_eachを使用する代わりに、dplyr::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() 
関連する問題