Seringkali, saya ingin memanipulasi beberapa variabel dalam DT dan saya perlu memilih nama kolom berdasarkan nama atau kelasnya.

d <- data.table(x = 1:10, y= letters[1:10])

# My usual approach
col <- str_subset(names(d), '^x')
d[, (col) := 2:11]

Namun, akan sangat berguna dan tidak terlalu bertele-tele untuk melakukan ini:

 d[, (names(.SD)) := 2:11, .SDcols = patterns('^x')]

Tapi ini menimbulkan kesalahan:

Error in `[.data.table`(d, , `:=`((names(.SD)), 2:11), .SDcols = patterns("^x")) : 
  LHS of := isn't column names ('character') or positions ('integer' or 'numeric')
> 

Nama kolom .SD tersedia, meskipun:

> d[, names(.SD), .SDcols = patterns('^x')]
[1] "x"

Mengapa nama .SD tidak tersedia untuk penugasan di LHS :=?

1
user116514 11 November 2020, 09:54

1 menjawab

Jawaban Terbaik

Seperti yang dicatat ini belum mungkin. Solusinya hanya menambahkan satu baris kode:

cols = grep('^x', names(d))
d[ , (cols) := 2:11, .SDcols = cols]
2
MichaelChirico 11 November 2020, 15:01