【问题标题】:How can I drop unused levels from a data frame?如何从数据框中删除未使用的级别?
【发布时间】:2013-06-20 15:39:54
【问题描述】:

给定以下模拟数据:

set.seed(123)
x <- data.frame(let = sample(letters[1:5], 100, replace = T), 
                num = sample(1:10, 100, replace = T))
y <- subset(x, let != 'a')

创建一个包含y$let 的表格

a  b  c  d  e 
0 20 21 22 18

但我不想再显示a。如果我尝试这样做:

levels(y$let) <- factor(y$let)

我弄乱了频率,因为现在table(y$let) 给了我

b  d  c  e 
0 20 21 40 

我知道我可以做 xtabs(~ y$let, drop.unused.levels = T) 并解决这个问题,但它不会重置其核心的变量级别(这对我来说很重要,因为这是我对数据集,将在整个分析过程中进行)。而且,xtabstable 是不同的类,这让我在项目后期很头疼。

问题是:如何自动更改levels(y$let),使其不显示创建子集时删除的级别?在这种情况下,我怎样才能让它显示[1] "b" "c" "d" "e"

【问题讨论】:

  • 重复问题中的获胜答案不如这里的答案。另一个应该被标记为这个的副本,因为这是一个更好的答案

标签: r levels


【解决方案1】:

R 中最近为此添加了一个函数:

y <- droplevels(y)

【讨论】:

    【解决方案2】:

    只需y$let &lt;- factor(y$let)。在现有因子变量上运行 factor 会将级别重置为仅存在的级别。

    【讨论】:

      【解决方案3】:

      添加到 Hong Ooi 的回答中,here is 是我从 R-Bloggers 找到的一个示例。

      # Create some fake data
      x <- as.factor(sample(head(colors()),100,replace=TRUE))
      levels(x)
      x <- x[x!="aliceblue"]
      levels(x) # still the same levels
      table(x) # even though one level has 0 entries!
      
      The solution is simple: run factor() again:
      x <- factor(x)
      levels(x)
      

      【讨论】:

        【解决方案4】:

        用于处理因子的 forcats 包通常是一个不错的选择。

        library(forcats)
        y$let <- fct_drop(y$let)
        

        【讨论】:

          猜你喜欢
          • 2013-06-09
          • 1970-01-01
          • 1970-01-01
          • 2021-02-06
          • 1970-01-01
          • 2018-01-31
          相关资源
          最近更新 更多