R 通过data.table中的变量名在i中创建子集
假设我有一个data.table,其列名称在变量中指定。例如,我可能使用了R 通过data.table中的变量名在i中创建子集,r,data.table,R,Data.table,假设我有一个data.table,其列名称在变量中指定。例如,我可能使用了dcast作为: groups <- sample(LETTERS, 2) # i.e. I don't now the values dt1 <- data.table(ID = rep(1:2, each = 2), group = groups, value = 3:6) (dt2 <- dcast(dt1, ID~group, value.var = "value")) # ID D Q #
dcast
作为:
groups <- sample(LETTERS, 2) # i.e. I don't now the values
dt1 <- data.table(ID = rep(1:2, each = 2), group = groups, value = 3:6)
(dt2 <- dcast(dt1, ID~group, value.var = "value"))
# ID D Q
# 1: 1 3 4
# 2: 2 5 6
有简单的方法吗?
我发现我可以用钥匙做到这一点:
setkeyv(dt2, groups)
dt2[.(3, 4)]
# ID D Q
# 1: 1 3 4
但我该如何做更详细的事情呢
dt2[groups[1] > 3 & groups[2] < 7]
dt2[组[1]>3和组[2]<7]
?您可以使用
get
to(from?get
)
按名称搜索对象
:
我们可以将
eval
与as.name
一起使用,它应该比get
dt2[eval(as.name(groups[1])) > 2 & eval(as.name(groups[2])) == 4]
# ID L U
#1: 1 4 3
是的,这很有道理,谢谢!@Max感谢您的更新删除了我的postBest,请在制作随机示例之前使用
set.seed
。正如你在答案中所看到的,他们无法重现你的例子。。。(改为A、J栏)。@Frank大体上我同意,但在这种情况下这并不重要。一个随机的例子用来强调我事先不知道变量名。@akrun有一种感觉,它不是重复的。我们现在(从1.9.7开始)有了非等联接,OP可以在这里使用非等联接来过滤条件,如groups[1]>3和groups[2]<7
,语法如dt2[(3,7),on=(D>V1,Q<7)]
,利用二进制搜索。然而,我认为,即使使用链接中包含的方法,也无法动态地将名称D和Q传递给on=
。@akrun当然,我对投票的“正确”使用没有什么可说的。如果你被联合起来或以其他方式作为目标,把它交给mods。@akrun好吧,mods有权将问题上报给工作人员注意,我想他们可以看到这样的事情。无论如何,我们没有理由在Max的问题下讨论这个。
dt2[get(groups[1]) > 2 & get(groups[2]) == 4]
# ID A J
#1: 1 3 4
dt2[eval(as.name(groups[1])) > 2 & eval(as.name(groups[2])) == 4]
# ID L U
#1: 1 4 3