数据表因子的r%在%运算符行为?
我似乎无法使%in%运算符对数据表因子列起作用。我知道我可能缺少一些数据表的秘密语法,但我找不到它。。。我找遍了 这里有一个小例子说明了我的痛苦。当然,简单的答案是使用数据帧,但我有一个大型数据集,它得益于数据表的一些特性数据表因子的r%在%运算符行为?,r,data.table,R,Data.table,我似乎无法使%in%运算符对数据表因子列起作用。我知道我可能缺少一些数据表的秘密语法,但我找不到它。。。我找遍了 这里有一个小例子说明了我的痛苦。当然,简单的答案是使用数据帧,但我有一个大型数据集,它得益于数据表的一些特性 > a <- data.table(c1=factor(c(1,2,3))) > a c1 1: 1 2: 2 3: 3 > '2' %in% a[,1,with=F] [1] FALSE > 2 %in% a[,1,with=F
> a <- data.table(c1=factor(c(1,2,3)))
> a
c1
1: 1
2: 2
3: 3
> '2' %in% a[,1,with=F]
[1] FALSE
> 2 %in% a[,1,with=F]
[1] FALSE
>a
c1
1: 1
2: 2
3: 3
>%a[,1,带=F]中的“2%”
[1] 假的
>%a中的2%[,1,带=F]
[1] 假的
它的工作原理和我对数据帧的期望一样
> b <- data.frame(c1=factor(c(1,2,3)))
> '2' %in% b[,1]
[1] TRUE
%b[,1]中的b“2%”
[1] 真的
感谢您的帮助……
a[,1,with=F]
是一个data.table,而不是像b[,1]
那样的向量。这是有案可查的
data.table是一个列表,帮助(“%in%”)
表示“列表转换为字符向量”。所以,我猜会发生这种情况(但它隐藏在match
的C源代码中):
您可以使用[[
高效地选择data.table列:
'2' %in% a[[1]]
#[1] TRUE
这一切都归结为这样一个事实:
data.table
没有drop
参数,而data.frame
有参数。换句话说,如果您要选择多个列,您将从这两个列中获得类似的行为。顺便说一句,我希望使用%In%
来匹配数据。大小合适的table列会非常慢。Th对于您的实际目标,可能有更好的选择。@Roland可能。但我不太擅长优化R。所讨论的因子有3个值和大约20k行。我只需要知道是否有()出现在列中。欢迎您的建议。:)并感谢您的原始答案。那么,在使用droplevels
之后,您应该与级别进行比较。我知道选择带有[[
的列,但在我的问题中没有提到我还需要过滤一些行。因此我使用了语法a[myrows,1,with=F]
。现在我切换到类似于a[myrows][[1]]]
。
'2' %in% a[[1]]
#[1] TRUE