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]
没有降低!!
答案 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我......