8

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:我对降低向量的因子水平感到困惑,正如您在此处看到的那样。[i, drop = TRUE]降低因子水平并[i, j, drop = TRUE]没有,这不是很直观!!

4

4 回答 4

11

该文件明确指出:

下降:合乎逻辑。如果为 TRUE,则结果被强制转换为可能的最低维度。如果只剩下一列,默认是删除,但如果只剩下一行,则不删除。

这意味着如果drop = TRUE过滤data.frame后的结果在单个列或行中,则结果将被强制转换为向量/列表,而不是返回单列/单行data.frame

因此,这个论点与水平下降无关,因此消除超水平的正确方法是您提到的方法(即使用droplevels函数)。

于 2013-01-02T14:35:16.783 回答
6

这对许多人来说是一个绊脚石,因为正如 Peter Dalgaard 在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) 
于 2013-01-02T14:34:08.257 回答
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
于 2013-01-02T14:39:16.787 回答
1

df[1:2,]$a[,drop=TRUE]

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

哟人,所以当你尝试用你的方法时会发生什么,它会在原始数据帧上应用丢弃,所以你想要的结果不会好

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

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

于 2017-03-02T20:22:43.220 回答