想象一下,我想在mtcars
數據集中記錄下列變量:disp
,wt
和drat
。我想將它們保存爲log_disp
,log_wt
和log_wt
。變換多個變量並用新名稱保存
我可以把日誌所有與保存:
cols <- c("disp","wt","drat")
mtcars[cols] <- log(mtcars[cols])
然而,這將覆蓋初始變量,我想保持。我怎樣才能同時轉換並保存爲一個新變量?
想象一下,我想在mtcars
數據集中記錄下列變量:disp
,wt
和drat
。我想將它們保存爲log_disp
,log_wt
和log_wt
。變換多個變量並用新名稱保存
我可以把日誌所有與保存:
cols <- c("disp","wt","drat")
mtcars[cols] <- log(mtcars[cols])
然而,這將覆蓋初始變量,我想保持。我怎樣才能同時轉換並保存爲一個新變量?
只是追加到分配的名稱:
mtcars[paste("log",cols,sep="_")] <- log(mtcars[cols])
我們可以用tidyverse
,使這個更具動感
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)
注意:dplyr
解決方案都使用標準dplyr
語法
我真的很喜歡James & David所推薦的基本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))
創建一個名爲向量,新列添加到結果,而不是修改現有列。
'mtcars [paste0(「log_」,cols)] < - log(mtcars [cols])' –
感謝您的回答,我在考慮一些動態應用...但您的解決方案更整潔, ! – user3507584