我正在尝试找到一种解决方法来粘贴数据表的所有列,其中“collapse”参数的设置取决于列类。
示例数据:
DT <- data.table(Char1 = c('a','b','c','d'),
Int1 = c(1:4),
Char2 = c('e','f','g','h'),
Int2 = c(5:8))
sapply(DT, class)
Char1 Int1 Char2 Int2
"character" "integer" "character" "integer"
所需的结果将是这样的: 字符,POSIX等用引号括起来但是整数,数字不是。
"'a', 1, 'e', 5"
"'b', 2, 'f', 6"
"'c', 3, 'g', 7"
"'d', 4, 'h', 8"
作为背景信息...... 我想使用它来生成基于变量类的正确语法的SQL插入语句。
答案 0 :(得分:3)
如果s
是问题中sapply
的输出,那么:
fmt <- toString(ifelse(s == "character", "`%s`", "%d"))
DT[, do.call("sprintf", cbind(fmt, .SD))]
,并提供:
[1] "`a`, 1, `e`, 5" "`b`, 2, `f`, 6" "`c`, 3, `g`, 7" "`d`, 4, `h`, 8"
此变体也有效:
do.call("sprintf", cbind(fmt, DT))
答案 1 :(得分:2)
您可以像这样使用shQuote
和ifelse
:
# named logical vector for numeric vars
temp <- !sapply(DT, is.numeric)
paste(ifelse(temp, shQuote(names(temp)), names(temp)), collapse=", ")
[1] "'Char1', Int1, 'Char2', Int2"
让它在所有行上运行的一种方法是将data.frame转换为字符矩阵并使用apply
遍历行。
apply(as.matrix(DT), 1,
function(...) paste(ifelse(temp, shQuote(...), ...), collapse=", "))
[1] "'a', 1, 'e', 5" "'b', 2, 'f', 6" "'c', 3, 'g', 7" "'d', 4, 'h', 8"