2017-02-07 43 views
0

是否有一种更好的方法来更新从data.table中名称选择的列的范围?R:更新data.table中的列名称范围

例如,假设我们有

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

我想从报价A添加到所有列使用function(x) paste0('"', x, '"')到B点。

我想:

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

没有结果。

+0

请问'的cols < - C( “A”, “B”); dt [,(cols):= lapply(.SD,dQuote),.SDcols = cols]'工作? –

+0

@DavidArenburg OP的问题是他不想手动创建名称 – akrun

+0

@DavidArenburg作为附注,我使用dQuote而不是paste0将引号添加到多列并保存到csv文件。我注意到使用dQuote时文件大小几乎是其两倍。你知道为什么吗? – mat

回答

1

我们可以使用names,甚至有一些像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中的某个地方,有4个连续的列名为“A”,“B”,“C”,“D”。 – mat