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

时间:2017-03-20 00:49:10

标签: r select data.table

我有一个包含许多列的data.table: 让我们举一个简单的例子:

mm <- data.table( A = 1:4, B = 5:8, C = 5:2, D= c(1,1,1,1))

包含一些名称为字符串的向量:(*)

nn <- c("A", "B", "C")

我希望将nn指定的mm内容cbind为:

1
2
3
4
5
6
7
8
5
4
3
2

不幸的是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]],...):对象&#39; A&#39;找不到

lapply(nn,function(x) (mm[,.SDcols=x]))

也不起作用 我也尝试过使用eval,parse,noquote和其他选项。

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

melt(mm[,.SD,.SDcols=nn])$value

有没有更简单的方法?

(*)来自grep操作。

1 个答案:

答案 0 :(得分:3)

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

mm[, unlist(.SD), .SDcols = nn]

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

mm[, .(unlist(.SD)), .SDcols = nn]