![](/img/trans.png)
[英]Selecting specific columns when using mutate_each function from dplyr
[英]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_each
, dplyr::mutate
與tidyr::gather
和tidyr::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.