2017-04-24 10 views
1

wtおよびdratのデータセットで、mtcarsデータセットの次の変数のログを取得するとします。私はそれらをlog_disp,log_wtおよびlog_wtとして保存したいと思います。複数の変数を変換して新しい名前で保存する

私はすべてのログを取るとして、それを保存することができます:

cols <- c("disp","wt","drat") 
mtcars[cols] <- log(mtcars[cols]) 

しかし、これは私がキープしたい初期変数を、上書きされます。どのように私は新しい変数として同時に変換して保存できますか?

+2

mtcars [paste0( "log_"、cols)] < - log(mtcars [cols]) ' –

+0

答えがありがとう、私はいくつかの動的適用を考えていた...しかし、 ! – user3507584

答えて

3

だけ割り当て内の名前に追加:

mtcars[paste("log",cols,sep="_")] <- log(mtcars[cols]) 
0

私たちは、このよりダイナミックな

library(tidyverse) 
f1 <- function(data, columns){ 
data %>% 
     transmute_at(columns, log) %>% 
     rename_all(funs(paste("log", columns, sep="_"))) %>% 
     bind_cols(data, .) 

} 

res <- f1(mtcars, cols) 
head(res, 3) 
# mpg cyl disp hp drat wt qsec vs am gear carb log_disp log_wt log_drat 
#1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 5.075174 0.9631743 1.360977 
#2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 5.075174 1.0560527 1.360977 
#3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 4.682131 0.8415672 1.348073 

それともmutate_at

f2 <- function(data, columns){ 
data %>% 
     mutate_at(columns, funs(log = log(.))) %>% 
     rename_at(vars(matches('log')), funs(sub('(\\w+)_(\\w+)', "\\2_\\1", .))) 
} 
f2(mtcars, cols) 
を使用して機能を変更するために tidyverseを使用することができます

注:どちらのdplyrソリューションも標準dplyr構文を使用しています

1

私は本当にジェームスによって紹介されたベースRの方法が好きです&デビッド。比較的単純なdplyrソリューションも用意されています:

library(dplyr) 
mutate_at(mtcars, setNames(cols, paste0("log_", cols)), log) 
# mpg cyl disp hp drat wt qsec vs am gear carb log_disp log_wt log_drat 
#1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 5.075174 0.9631743 1.360977 
#2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 5.075174 1.0560527 1.360977 
#3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 4.682131 0.8415672 1.348073 

setNames(cols, paste0("log_", cols))という名前のベクトルを作成するので、新しい列ではなく、既存の列を変更した結果に追加されます。

関連する問題