Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 转换多个变量并使用新名称保存它们_R - Fatal编程技术网

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