从一组可能的标签中将标签分配给数据框

问题描述

我想创建一个功能来更新来自不同环境的数据框。具体来说,我想使用var functions = <Function>[function1,function2,function3]; //... //then,in the onpressed: onpressed: (int index) { //call the function of that index functions[index](); } 函数更新数据框的标签

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)

解决方法

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)

如果mtcar位于全局环境中,则会使用新值覆盖它,但在这种情况下mtcars在数据集中,因此将新的mtcar写入调用方,而数据集中的原始mtcar保持不变。

3)替换功能尽管R并未广泛使用,但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)
,

关于关于不修改超出函数范围的注释,我创建了两个函数,这些函数用标签分配新的数据框。

fetch_label <- function(col) {
  val <- c("mpg" = "MPG","hp" = "HP") 
  unname(val[col])
}
 
assign_label <- function(df,col) {
  col <- rlang::as_name(rlang::ensym(col))
  Hmisc::label(df[[col]]) <- fetch_label(col)
  return(df)
}

assign_labels <- function(df) {
  purrr::iwalk(df,function(.x,.y) {
    lab <- fetch_label(.y)
    Hmisc::label(df[[col]]) <<- lab
  })
  return(df)
}

mtcars <- mtcars %>% assign_label(hp)
mtcars <- mtcars %>% assign_labels()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...