r - 从可能的标签库中将标签分配给数据框

标签 r non-standard-evaluation

我想创建一个函数来更新来自不同环境的数据框。具体来说,我想使用 Hmisc::label() 函数更新数据框的标签。

assign_label <- function(df, col) {
  col <- rlang::as_name(rlang::ensym(col))
  Hmisc::label(df[,col]) <- fetch_label(col)
}

fetch_label <- function(col) {
  val <- c("mpg" = "MPG",
           "hp" = "HP") 
  unname(val[col])
}

以下代码执行没有问题:assign_label(mtcars, hp)

但是,它实际上并没有改变调用环境中的数据帧。我只是不知道如何让它实现我的想象。

理想情况下,我希望能够将数据帧通过管道传输到此函数,如下所示:

mtcars %>% allocate_label(mpg)

最佳答案

1) 返回修改后的对象 在 R 中不鼓励就地修改对象。通常的方法是返回数据框,然后将其分配给新名称或返回原始名称破坏或遮蔽它。

assign_label <- function(df, col) {
  col <- deparse(substitute(col))
  Hmisc::label(df[[col]]) <- fetch_label(col)
  df
}

mtcars_labelled <- mtcars %>% assign_label(mpg)

2) magrittr 尽管我们上面已经说过,R 和某些 R 包中还是有一些就地修改的功能。 magrittr 包提供了用于覆盖或隐藏输入的语法。使用(1)中的定义我们可以写:

library(mtcars)
mtcars %<>% assign_label(mpg)

如果 mtcars 在全局环境中,它会用新值覆盖它,但在这种情况下,mtcars 在数据集中,因此新的 mtcars 会写入调用者,并且数据集中的原始值不会改变。

3)替换函数 虽然没有广泛使用,但 R 确实提供了像这样定义和使用的替换函数。这确实会覆盖或隐藏输入。

`assign_label<-` <- function(df, value) {
  Hmisc::label(df[[value]]) <- fetch_label(value)
  df
}

assign_label(mtcars) <- "mpg"

注意

顺便说一句,如果目标是与 tidyverse 一致的界面,那么使用 tidyselect检索列名称,以便像下面这样的示例可以工作:

assign_labels <- function(df, col) {
  nms <- names(select(df, {{col}}))
  for(nm in nms) Hmisc::label(df[[nm]]) <- fetch_label(nm)
  df
}

mtcars_labelled <- mtcars %>% assign_labels(starts_with("mp"))
str(mtcars_labelled)

mtcars_labelled <- mtcars %>% assign_labels(mpg|hp)
str(mtcars_labelled)

关于r - 从可能的标签库中将标签分配给数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63641347/

相关文章:

r - 在 R 中进行非标准评估时部分评估表达式

r - 如何使用 R 的 ggplot2 包更改条形图的颜色?

r - 如何绘制 ROC 曲线以从 Weka 输出的二元类和多类数据进行交叉验证?

r - 循环字符向量并使用元素作为 lambda 函数中的列名

r - 在哪里(如果有的话)记录了非标准评估的危险?

r - 使用非标准评估迭代某些内部环境中定义的符号

r - 如何创建一个循环

r - Selenium 服务器无法启动

r - 如何向量化 r 中的复杂迭代循环

r - 什么 'Can' t 在顶层使用 `!!!`。是什么意思以及如何解决?