drop = TRUE不会降低data.frame中的因子级别,而它在向量中也是如此

时间:2013-01-02 14:28:28

标签: r dataframe r-factor

data.frame过滤中有一个有趣的选项drop = TRUE,请参见摘自help('[.data.frame')

  

用法

     

类'data.frame'的S3方法

x[i, j, drop = ]

但是当我在data.frame上尝试它时,它不起作用!

> df = data.frame(a = c("europe", "asia", "oceania"), b = c(1, 2, 3))
>
> df[1:2,, drop = TRUE]$a
[1] europe asia  
Levels: asia europe oceania     <--- oceania shouldn't be here!!
>

我知道还有其他方法,比如

df2 <- droplevels(df[1:2,])

但文档承诺更优雅的方式来做到这一点,为什么它不起作用?这是一个错误吗?因为我不明白这可能是一个特征......

编辑:我对drop = TRUE向量的因子水平下降感到困惑,为you can see here[i, drop = TRUE]降低因子水平而[i, j, drop = TRUE]没有降低!!

是不是很直观

4 个答案:

答案 0 :(得分:9)

文件明确指出:

  

drop:逻辑。如果为TRUE,则结果强制为尽可能低   尺寸。如果只剩下一列,则默认为删除,但不是   如果只剩下一行就丢弃。

这意味着如果drop = TRUE和过滤的data.frame导致单个列或行,则结果将强制转换为向量/列表,而不是返回单列/单行{{ 1}}。

因此,这个参数与水平下降无关,因此消除超出水平的正确方法就是你提到的那个(即使用data.frame函数)。

答案 1 :(得分:6)

这对许多人来说是一个绊脚石,因为“堕落做了不同的事情”,正如彼得·达尔加德在http://www.mail-archive.com/r-help@stat.math.ethz.ch/msg22459.html和下面的digEmAll中解释的那样。

如果你想要你想要的东西:

d2[] <- lapply(d2, function(x) if (is.factor(x)) factor(x) else x) 

答案 2 :(得分:6)

文件说的是

  

如果为TRUE,则会将结果强制转换为可能的最低维度

所以它与维度有关,而与因子水平无关:

df[, 1]
# [1] europe  asia    oceania
# Levels: asia europe oceania
df[, 1, drop = FALSE]
#         a
# 1  europe
# 2    asia
# 3 oceania

降低因子水平是一个不同的问题。以下是一个案例(?'[.factor'),其中出现了参数drop

ff <- factor(c('AA', 'BA', 'CA'))
ff[1:2, drop = TRUE]
# [1] AA BA
# Levels: AA BA

答案 3 :(得分:0)

  

DF [1:2,] $ A [,降= TRUE]

[1]欧洲亚洲
级别:亚洲欧洲

哟,所以当你尝试使用你的方法时会发生什么,它会在原始数据框上应用掉落,所以你想要的结果不合适

所以你需要做的就是在返回的子集上应用drop ...确定.....

如果有任何疑问,请随时ping我......