R 转换多个变量并使用新名称保存它们
假设我想在R 转换多个变量并使用新名称保存它们,r,R,假设我想在mtcars数据集中记录以下变量:disp、wt和drat。我想将它们保存为log\u disp,log\u wt和log\u wt 我可以获取所有日志,并将其保存为: cols <- c("disp","wt","drat") mtcars[cols] <- log(mtcars[cols]) cols只需在作业中的名称后面追加: mtcars[paste("log",cols,sep="_")] <- log(mtcars[cols]) mtcars[粘贴(“
mtcars
数据集中记录以下变量:disp
、wt
和drat
。我想将它们保存为log\u disp
,log\u wt
和log\u wt
我可以获取所有日志,并将其保存为:
cols <- c("disp","wt","drat")
mtcars[cols] <- log(mtcars[cols])
cols只需在作业中的名称后面追加:
mtcars[paste("log",cols,sep="_")] <- log(mtcars[cols])
mtcars[粘贴(“log”,cols,sep=“”)]我们可以使用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
注意: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)]感谢您的回答,我正在考虑一些动态应用。。。但您的解决方案更整洁,可能也更快!
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