2017-09-23 3 views
2

"折りたたみ"パラメータが列クラスに応じて設定されているデータテーブルのすべての列を貼り付けるソリューションを探しています。折りたたみパラメータが列クラスに依存する貼り付け列

例のデータ:必要な

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 INSERT文を生成し、これを使用したいです。

答えて

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)) 
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" 
+0

おかげで答えはありますがそこにありますタイプミス? '!sapply'は私にとってはうまくいきません。 – kukuk1de

+0

申し訳ありません。私はそれを修正した。私は 'class'の代わりに' is.numeric'を使用しました。 – lmo

関連する問題