【问题标题】:drop = TRUE doesn't drop factor levels in data.frame while in vector it doesdrop = TRUE 不会在 data.frame 中删除因子级别,而在 vector 中会删除
【发布时间】:2012-12-16 22:09:07
【问题描述】:

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] 不会,这不是很直观!!

【问题讨论】:

  • 我认为您需要返回并实际阅读您链接到的文档。另外,droplevels(df[1:2,]) 一行就足够了。
  • 感谢@joran 和大家的解释。但是,如果有人不理解文档,是否有理由投反对票?(我对 drop = TRUE 为向量工作感到困惑,请参阅我的编辑)。现在我可能很想删除带有答案的非常有趣的问题..
  • 谁说我投了反对票?无论如何,如果文档以任何方式令人困惑或模棱两可,我认为您可能有一点。否则,我认为“缺乏研究”将适用于这种情况。
  • @Tomas:我同意你的观点(我没有投反对票),无论如何,当人们似乎没有仔细阅读文档时,SO 社区往往不太欣赏......(这是一个激烈的世界在这里;))
  • 您可以在stackoverflow.com/questions/1535021/…的列表中添加您最终观察到的答案(我同意这很奇怪)

标签: r dataframe r-factor


【解决方案1】:

文档明确指出:

drop:合乎逻辑。如果为 TRUE,则结果被强制为可能的最低值 方面。如果只剩下一列,默认是删除,但不是 如果只剩下一行,则删除。

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

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

【讨论】:

  • 谢谢!这是一个很大的困惑,[i, drop = TRUE] does drop factor levels[i, j, drop = TRUE] 没有!
  • @Tomas:是的,“drop”这个名字的选择可能不是一个好主意......他们本可以像lapply/tapply()函数那样使用“simplify”,这样IMO就更清楚了...
  • 是的,但是 simplify 参数在某些地方是 simplify 而在其他地方是 SIMPLIFYmapply,我想?)默认是 TRUE 在某些地方和FALSE 其他地方...叹息。
【解决方案2】:

这对许多人来说是一个绊脚石,因为“drop 做了不同的事情”,正如 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) 

【讨论】:

  • +1 链接到来自 R 核心成员的答案...为什么不只是 d2 &lt;- droplevels(d2) ...?您的解决方案是否做一些不同/更好的事情? (我看到 Peter Dalgaard 提出了该解决方案,但那是在将 droplevels 添加到基础 R 之前(我认为是在 2.13 中?)
  • 正确,那是在“droplevels”之前。我仍然觉得它很有用,因为我知道会发生什么。我从中了解了 d[]
【解决方案3】:

文档说的是

如果为 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

【讨论】:

  • 谢谢!这是一个很大的困惑,[i, drop = TRUE] does drop factor levels[i, j, drop = TRUE] 没有!
  • 如果类是factor,而不是data.frame,它会丢弃它。对我来说似乎很简单。
【解决方案4】:

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

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

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

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

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

【讨论】:

  • @AfshinMoazami 你想要什么例子,我刚刚回答了这个问题?
猜你喜欢
  • 2021-12-02
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 2022-01-19
  • 2012-06-23
相关资源
最近更新 更多