我有一系列值为 1.2、2.5 等的变量。我想用小数点分隔这些数字,以便为整数和小数点创建一个新列,然后分配总分。
HT_Q1 <- c(1.2, 2.5, 7.4)
HT_Q2 <- c(2.5, 8.5, 9.5)
AT_Q1 <- c(2.4, 1.2, 1.4)
AT_Q2 <- c(6.5, 1.5, 9.10)
df <- data.frame(HT_Q1, HT_Q2, AT_Q1, AT_Q2)
我可以使用 mutate 来做到这一点:
mutate(df,
HT_Q1_G = trunc(HT_Q1),
HT_Q1_B = HT_Q1 %% 1 * 10,
HT_Q1_P = (HT_Q1_G * 6) + HT_Q1_B)
但是,我想编写一个函数,这样我就不必为每个变量重复上述代码。是否可以将每个变量(HT_Q1、HT_Q2 等)作为参数传递给函数并创建相应的变量(例如 HT_Q2_G、HT_Q2_B、AT_Q2_G 等)?
我尝试根据传递给函数的参数创建变量名称,但它不起作用:
edit_score <- function(var){
mutate(df,
paste0(var, "_G") = trunc(var),
paste0(var, "_B") = var %% 1 * 10,
paste0(var, "_P") = (paste0(var, "_G") * 6) + paste0(var, "_B"))
}
edit_score(HT_Q1)
edit_score(HT_Q2)
edit_score(AT_Q1)
edit_score(AT_Q2)
我是 R 新手,有 SAS 背景,习惯于在执行代码之前使用宏编译器调整代码中的文本。
最佳答案
您可以在此处使用非标准评估:
library(dplyr)
library(purrr)
library(rlang)
edit_score <- function(var){
transmute(df,
!!paste0(var, "_G") := trunc(!!sym(var)),
!!paste0(var, "_B") := !!sym(var) %% 1 * 10,
!!paste0(var, "_P") := !!sym(paste0(var, "_G")) * 6 +
!!sym(paste0(var, "_B")))
}
bind_cols(df, map_dfc(names(df), edit_score))
sym
将列名的字符值转换为符号,并使用 !!
对其求值。
非标准评估最初可能很难理解,在这种情况下,您也可以使用这种基本 R 方法:
edit_score <- function(var){
col1 <- paste0(var, "_G")
col2 <- paste0(var, "_B")
col3 <- paste0(var, "_P")
df[[col1]] <- trunc(df[[var]])
df[[col2]] <- df[[var]] %% 1 * 10
df[[col3]] <- df[[col1]] * 6 + df[[col2]]
df[, c(col1, col2, col3)]
}
cbind(df, do.call(cbind, lapply(names(df), edit_score)))
关于r - 创建一系列变量,其名称基于函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63535597/