2017-02-07 4 views
0

data.tableの名前で選択された列の範囲を更新するエレガントな方法はありますか?例えばR:data.tableの列名の範囲を更新する

は、我々は、私がfunction(x) paste0('"', x, '"')を使用してからBへのすべての列に引用符を追加したい

dt <- data.table(A = LETTERS[1:5], B = LETTERS[6:10], C = LETTERS[11:15]) 

を持っているとしましょう。

私が試した:

dt[, .SD := lapply(.SD, function(x) paste0('"', x, '"')), .SDcols=A:B] 

を結果なしで。 c( "A"、 "B") -

+0

う 'colsの<namesかさえ持っているものを使用することができますdt [、(cols):= lapply(.SD、dQuote)、.SDcols = cols] '仕事ですか? –

+0

@DavidArenburg OPの質問は、手動で名前を作成したくないということです。 – akrun

+0

@DavidArenburgを副次的に使用しました.paste0の代わりにdQuoteを使用して複数の列に引用符を追加し、csvファイルに保存しました。 dQuoteを使用すると、ファイルサイズはほぼ2倍になっています。なぜなのかご存知ですか? – mat

答えて

1

は、我々のようなc("A", "B")

f1 <- function(dat, v1) Reduce(seq, which(colnames(dat) %in% v1)) 
i1 <- f1(dt, c('A', 'B')) 
dt[, (i1) := lapply(.SD, function(x) paste0('"', x, '"')), .SDcols=A:B] 
+0

私は必ずしもカラムの位置を持っているとは限らず、何百ものカラムがあるかもしれないので、手動でリストすることはできません。 – mat

+0

@matしかし、それは 'A:B'の範囲でそれを知っていますか?列がランダムな場合、唯一の方法は、パターンがない場合に手動で行うことです。 – akrun

+0

ランダムな順序ではありません。私が知っている唯一の事は、私のdata.tableのどこかに "A"、 "B"、 "C"、 "D"という4つの連続した列があるということです。 – mat

関連する問題