2017-09-22 35 views
1

我试图创建一个函数,其中我基于一列汇总数据表值,但我无法将参数传递给列名称的toString()。下面的例子可以更好地表现出来:数据表聚合和使用toString()

t1 <- data.table(P = c("a", "b", "c", "d", "a", "b"), Q = 
c("1","2","3","4","5","6")) 

t1[ ,toString(Q), by = P] # this works 
t1[ ,toString(colnames(t1)[2]), by = P] # this does not give me the desired result 

我得到以下结果与上面:

P V1 
1: a Q 
2: b Q 
3: c Q 
4: d Q 

相比于预期:

P V1 
1: a 1, 5 
2: b 2, 6 
3: c 3 
4: d 4 

我曾试图消除报价使用noquotes(),但没有为我工作。 任何人都可以指出我可能犯错的地方吗?

回答

2

我们可以用get返回值

t1[ , toString(get(colnames(t1)[2])), by = P] 
# P V1 
#1: a 1, 5 
#2: b 2, 6 
#3: c 3 
#4: d 4 

或用eval/as.symbol

t1[, toString(eval(as.symbol(names(t1)[2]))), by = P] 

还是标准的方式是在.SDcols

t1[, toString(.SD[[1]]), by = P, .SDcols = names(t1)[2]] 
+0

非常感谢指定!当我使用noquote()时有什么区别? – Ayush

+0

另外如果我有一个字符串。我打算创建一个函数来传递列名作为参数。 – Ayush

+0

你用编辑回答了第二个,谢谢! – Ayush