粘贴其中collapse参数取决于列类的列

时间:2017-09-23 17:29:56

标签: r

我正在尝试找到一种解决方法来粘贴数据表的所有列,其中“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插入语句。

2 个答案:

答案 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)

您可以像这样使用shQuoteifelse

# 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"