在向量的每个元素周围加上引号,并用逗号

时间:2016-07-08 16:51:13

标签: r

请考虑以下事项:

> n <- 1:4
> n
[1] 1 2 3 4

我想转换n,以便我得到一个'1', '2', '3', '4'字符串(R中的字符串显示为"'1', '2', '3', '4'")。

当我将sqlQuery()与变量字符串一起使用时,通常会出现这种情况。不幸的是,我对RegEx不够熟悉,无法轻松执行此操作。

我最接近的是

> paste0(n, collapse = "", sep = ",")
[1] "1,2,3,4,"

不会在每个数字周围加上单引号,并且最后会有额外的逗号。

1 个答案:

答案 0 :(得分:8)

一种选择是将sprintfpaste0

一起使用
paste0(sprintf("'%d'", 1:4), collapse = ", ")
#[1] "'1', '2', '3', '4'"

其中%d是来自C系列格式化函数(printfsprintf等)的有符号整数的标准格式化标志。您可以在帮助文件(?sprintf)中查看各种选项。

我更喜欢这个替代方案,因为sprintf调用解决了单个元素的格式,而paste0(..., collapse = "<whatever>")处理元素的组合;不过,您的意见可能有所不同。

我经常使用sprintf&amp; cat,结合paste0和其他函数,当我需要生成冗余表达式以复制到SQL Server,或生成C ++宏等时。例如,一堆INSERT语句

cat(sprintf("INSERT INTO #tmp(x, y, z) VALUES('%s', %d, %.2f);", 
            letters[1:5], 1:5, rnorm(5)), 
    sep = "\n"
)
#INSERT INTO #tmp(x, y, z) VALUES('a', 1, -1.10);
#INSERT INTO #tmp(x, y, z) VALUES('b', 2, 0.24);
#INSERT INTO #tmp(x, y, z) VALUES('c', 3, -0.82);
#INSERT INTO #tmp(x, y, z) VALUES('d', 4, -0.46);
#INSERT INTO #tmp(x, y, z) VALUES('e', 5, 0.72);