首页 > 解决方案 > 将数据框列名设置为字符串,即切换字符类型为“编程语言”类型?

问题描述

我不知道如何在标题中很好地描述这个问题。作为一个任意示例,我创建了一个创建向量数据框的函数,其参数应该是新数据框的列名。但是,当我运行该函数时,它返回“string”作为数据框 colname,而不是“character_string”作为 colname。非常简单,我知道发生了什么,只是我似乎找不到合适的 R 函数来帮助我实现这一目标。

func <- function(string){
  vec <- 1:5
  df <- data.frame(string = vec)
  return(df)
}

df <- func("character_string")
df
    string
1        1
2        2
3        3
4        4
5        5

这是另一个例子,

func2 <- function(statement){
  df <- data.frame(col1 = 1:5, col2 = 5:10)
  flag <- FALSE
  if(statement){
    flag <- TRUE
  }
  return(flag)
}

func2("df[1,1] == 1")

这显然会返回一个错误,我需要func2返回flagas TRUE。这似乎是一种非常奇怪的做事方式,但我只是想围绕这个概念来解决其他一些应用程序。

标签: r

解决方案


您问题的第一部分:您可以使用setNames()names(x) <- ""更改data.frame创建后的名称。

func <- function(string){
  vec <- 1:5
  df <- data.frame(string = vec)
  setNames(df, string)
}

func("character_string")
#>   character_string
#> 1                1
#> 2                2
#> 3                3
#> 4                4
#> 5                5

tidyverse 允许您在创建时使用函数参数的值作为变量的名称。有关详细信息,请参见此处

library(tidyverse)
func_b <- function(string){
  vec <- 1:5
  tibble({{string}} := vec)
}

func_b("character_string")
#> # A tibble: 5 x 1
#>   character_string
#>              <int>
#> 1                1
#> 2                2
#> 3                3
#> 4                4
#> 5                5

您问题的第二部分:eval()和的组合parse()允许您评估作为文本字符串提供的条件。

func2 <- function(statement){
  df <- data.frame(col1 = 1:5, col2 = 6:10)
  eval(parse(text = statement))
}

func2("df[1,1] == 1")
#> [1] TRUE

如果要在比较语句上调用函数并确保针对函数环境评估该语句,这意味着:您不要在比较语句周围加上引号,使用substiture()andeval()如下。

func2_b <- function(statement){
  df <- data.frame(col1 = 1:5, col2 = 6:10)
  eval(substitute(statement))
}

func2_b(df[1,1] == 1)
#> [1] TRUE

推荐阅读