R cbinding data.table由字符串名称向量指定的列?

R cbinding data.table由字符串名称向量指定的列?,r,select,data.table,R,Select,Data.table,我有一个data.table,其中有许多列: 让我们举一个简单的例子: mm <- data.table( A = 1:4, B = 5:8, C = 5:2, D= c(1,1,1,1)) 不幸的是,在这些情况下,cbind(eval(nn))是不够的。 如果A、B和C不在data.table中,我可以试试 cbind(lapply(as.list(noquote(c("a","b"))), get)) or mapply( function(x) cbind(get(noquote(

我有一个data.table,其中有许多列: 让我们举一个简单的例子:

mm <- data.table( A = 1:4, B = 5:8, C = 5:2, D= c(1,1,1,1))
不幸的是,在这些情况下,cbind(eval(nn))是不够的。 如果A、B和C不在data.table中,我可以试试

cbind(lapply(as.list(noquote(c("a","b"))), get))
or
mapply( function(x) cbind(get(noquote(x))), as.list(nn))
但它们不能正常工作。 到目前为止,我找到的唯一工作方法是

unlist(lapply(nn,get))
但在我的问题中,它们不是独立的对象,而是在mm data.table中,这种方法似乎不起作用

我也试过了

mm[, lapply(nn, get)]
但是它说

FUN(X[[i]],…)中出错:未找到对象“A”

也不行 我还尝试了eval、parse、noquote和其他选项

到目前为止,我只找到了这个解决方案:

melt(mm[,.SD,.SDcols=nn])$value
有没有更简单的方法


(*)来自grep操作。

要获取命名向量,可以使用

mm[, unlist(.SD), .SDcols = nn]
或者,如果您需要将结果作为data.table,那么我们可以简单地将
j
参数包装在
()


与下面的答案相比,我更喜欢您的melt方法,尽管您可以使用
melt(mm[,…nn])$value
@Frank,但为什么您更喜欢melt方法?未列出保留名称,并且不会警告如何组合不同类型的列。例如,
DT=data.table(a=as.Date(“1978/1/1”),b=11,v=2L);熔体(DT);取消列表(DT)
。一般来说,这是因为我知道从
melt
。。。用列表列扩展示例:
DT=data.table(a=as.Date(“1978/1/1”),b=11,v=2L,k=list(1:2));未上市(DT);melt(DT,meas=names(DT))
——后者似乎是正确的结果。
lapply(nn,function(x) (mm[,.SDcols=x]))
melt(mm[,.SD,.SDcols=nn])$value
mm[, unlist(.SD), .SDcols = nn]
mm[, .(unlist(.SD)), .SDcols = nn]