如何在 R 中将字符元素的引号转换为用反引号而不是引号括起来

How to convert quotes of character elements to be surrounded by backticks instead of quotes in R

提问人:Farhan 提问时间:2/27/2022 最后编辑:Farhan 更新时间:2/27/2022 访问量:520

问:

我有一些字符存储为 cols。结果输出如下:

cols = c("big creek", "gage creek", "garvey creek", "larches creek", "little usable")
cols
[1] "big creek"       "gage creek"      "garvey creek"    "larches creek"   "little usable"

但是,我希望将引号替换为反引号,并且生成的输出应如下所示:

[1] `big creek`       `gage creek`      `garvey creek`    `larches creek`   `little usable`

有没有办法在 R 中为对象获得相同的输出?cols

您的帮助将不胜感激。

问候 法尔汉

R 字符 反引号

评论


答:

0赞 jay.sf 2/27/2022 #1

您的字符串实际上没有引号,它们只是在控制台上以这种方式显示。当使用 .$

在 R 中,语法上有效的对象名称应仅由字母、数字、点和下划线组成,第一个字符不应包含数字或点。您可以使用 轻松解决此问题。make.names

例:

df <- data.frame(`big creek`=1:3, `gage creek`=4:6, `garvey creek`=7:9, check.names=F)
df
#   big creek gage creek garvey creek
# 1         1          4            7
# 2         2          5            8
# 3         3          6            9

names(df) 
# [1] "big creek"    "gage creek"   "garvey creek"  ## invalid names

df$`big creek`  ## rather annoying backticks needed
# [1] 1 2 3

cols1 <- names(df)  ## vector of column names
cols1
# [1] "big creek"    "gage creek"   "garvey creek"

make.names(cols1)  ## `make.names` fixes names
# [1] "big.creek"    "gage.creek"   "garvey.creek"

names(df) <- make.names(cols1)
names(df) 
# [1] "big.creek"    "gage.creek"   "garvey.creek"  ## valid names

## actually you don't need to cache in a vector and just may do
names(df) <- make.names(names(df))

从那时起,使用有效的名称进行编码并单独标记您的数据,例如:

barplot(colSums(df), names.arg=c("big creek", "gage creek", "garvey creek"))

enter image description here

也就是说,如果您仍然想让字符串被反引号包围,则可以使用 .sprintf

sprintf('`%s`', cols)
# [1] "`big creek`"     "`gage creek`"    "`garvey creek`"  "`larches creek`" "`little usable`"

评论

0赞 Farhan 2/27/2022
感谢您的快速回复。我实际上正在使用 for 循环功能在 ggplot2 包中绘制图形,以在网格中打印多个图形。对于引号或字符性质的 y 参数是不可接受的。当我用 bacticks 替换“”时,代码运行良好。但是对于循环,我想要 y 参数,因为这里 cols[i] 应该打印而不是“big creek”。aes(x = datetime, y = "big creek")y = cols[i]big creek
0赞 jay.sf 2/27/2022
@Farhan 如图所示,用于修复无效的列名。区分对象在 R 中的命名方式,以及某些内容在输出(如绘图)上的显示方式。make.names
0赞 Farhan 2/27/2022
我尝试用于 cols 对象。然后我在 aes() 函数中使用 cols[1] 作为 y 参数,但它导致了错误: 错误:提供给连续刻度的离散值make.names
0赞 jay.sf 2/27/2022
@Farhan 也许我不清楚,请看我更新的答案。
0赞 Farhan 2/27/2022
感谢您的详细回答。它在 plot 函数中工作,但不作为 in 函数的 y 参数的答案。我正在尝试将 y 参数作为 cols[1] 来打印“大希腊语”的情节,但我不想实际为每个站点手动输入名称。我可以在 for 循环中使用 cols[i] 来自动使用这些列名,但是当我使用 cols[1] 作为 y 参数的答案时,问题就在那里,它打印带有引号的“大希腊语”,而不是反引号(不带引号)。aes()ggplot()
2赞 Onyambu 2/27/2022 #2

不能有包含反引号名称的向量。既然你说你正在使用 for 循环,你可以转换每个名称以包含 for 循环中的反引号:as.name

as.name(cols[1])
`big creek`

lapply(cols, as.name)
[[1]]
`big creek`

[[2]]
`gage creek`

[[3]]
`garvey creek`

[[4]]
`larches creek`

[[5]]
`little usable`

评论

0赞 Farhan 2/27/2022
谢谢。这就是我正在寻找的获取输出的内容,但将其用于 ggplot 美学中的论证,它将 cols[1] 视为符号而不是数据列。但是,粘贴 as.names(cols[1]) 的输出确实可以打印图表。我已经修改了每个站点的参数并设置了过滤器,它在循环功能中运行良好。感谢大家的宝贵意见。ydata
0赞 TarJae 2/27/2022 #3

也许是这样的:

result <- gsub('^(.{0})(.*)$', '\\1`\\2`', cols)
paste(result, collapse = " ")

输出:

1] "`big creek` `gage creek` `garvey creek` `larches creek` `little usable`"