r - 创建一系列变量,其名称基于函数参数

标签 r dplyr

我有一系列值为 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/

相关文章:

r - r 中的多个变量过滤器

r - 如何使用R通过余弦相似度有效地检索前K个相似向量?

r - dplyr 在 mutate() 中使用 select() 助手

r - 如何在两列中重新组合具有共同值的元素

r - dplyr 重命名 "object not found"

r - 如何在没有仪表板结构的 ShinyApp 中利用 valuebox?

r - 从命名空间访问(导出)函数

r - DT::datatable 中的文本输入解除绑定(bind),我无法重新绑定(bind)它

r - 如何查找多列的每一行是否有NA?

r - 当列没有通用类型时如何延长数据集的旋转时间