Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数据表因子的r%在%运算符行为?_R_Data.table - Fatal编程技术网

数据表因子的r%在%运算符行为?

数据表因子的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

我似乎无法使%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]
[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