我有一个包含许多列的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操作。
答案 0 :(得分:3)
要获取命名向量,可以使用
mm[, unlist(.SD), .SDcols = nn]
或者,如果您需要将结果作为data.table,那么我们可以简单地将j
参数包装在.()
mm[, .(unlist(.SD)), .SDcols = nn]