r - 将数据框列名设置为字符串,即切换字符类型为“编程语言”类型?
问题描述
我不知道如何在标题中很好地描述这个问题。作为一个任意示例,我创建了一个创建向量数据框的函数,其参数应该是新数据框的列名。但是,当我运行该函数时,它返回“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
返回flag
as TRUE
。这似乎是一种非常奇怪的做事方式,但我只是想围绕这个概念来解决其他一些应用程序。
解决方案
您问题的第一部分:您可以使用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
推荐阅读
- python - 在 python 中复制/移动许多 OSX 别名(...文件?路径?)
- gcc - 主程序和共享库中同名的段(same __attribute__((section(“name”))))会放在同一个内存段吗?
- angular - 使用 anuglar 拖放织物不起作用
- magnolia - 从 FS magnolia 5.7.9 加载模块配置文件
- rabbitmq - 是否有一些命名多个 AMQP 项目的准则?
- python - (Folderwide) 将 ffmpeg 中的批量转换为 H264 编解码器
- javascript - D3 重绘链接标签
- python - 插入烧瓶 SQLAlchemy 在与关联表的多对多关系中插入数据时出错
- sql - 从 Oracle DB 中提取 VBA 中的 XML
- reactjs - 打开和关闭复选框,控制台记录所选复选框的 ID。我怎样才能做到这一点?