筛选/子集后,数据框变为因子/向量。

8

我有一个只有一列的数据框,如下所示:

>d = data.frame(animal=c("horse","dog","cat"))

然后我通过排除向量中存在的所有项目来对其进行过滤。例如:

> res = d[!(d$animal %in% c("horse")),]
> res
[1] dog cat
Levels: cat dog horse
>class(res)
[1] "factor"

这里发生了什么事情?

同时请注意,数据框中列的类别不是“character”,而是“factor”:class(d[[1]]) - Joshua Ulrich
1个回答

13

欢迎来到R语言。您刚刚遇到了一个名叫drop的烦恼: 您需要明确告诉R不要“降为一维”:

res = d[!(d$animal %in% c("horse")), , drop = FALSE] 

请参阅Patrick Burns的R地狱,以获取更详细的讨论:http://lib.stat.cmu.edu/S/Spoetry/Tutor/R_inferno.pdf - Prasad Chalasani
1
很有趣,我已经使用R语言3到4年了,这是我第一次遇到这种情况。我猜我通常不使用只有1列的数据框。 - Ron Gejman
我并不感到惊讶。这是在深入调试某些函数时出现的微妙问题。引用来自R地狱的Patrick Burns的话:“在函数内部未使用drop=FALSE是错误的主要来源。只有当下标的长度大于1时,您才测试该函数。一旦遇到下标长度为1的情况,该函数就会失败|在某个地方下游期望矩阵,而实际上只有一个简单的向量。” - Prasad Chalasani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接