【问题标题】:R: How to get factor levels found in dataR:如何获取数据中的因子水平
【发布时间】:2021-10-02 17:48:10
【问题描述】:

如何列出数据中存在的因子水平?

让我们初始化数据:

df <- data.frame(
    v1 = c( 'b', 'c', 'a', NA ),
    v2 = c( 2, 1, 3, 1 )
)
df$v1 <- factor(
    df$v1,
    levels = c( 'a', 'b', 'c', 'd' ),
    ordered = TRUE
)

现在,levels() 给出了所有级别,包括数据中未找到的级别:

> levels( df$v1 )
[1] "a" "b" "c" "d"

unique() 给出了所有唯一值,包括NA

> unique( df$v1 )
[1] b    c    a    <NA>
Levels: a < b < c < d

我正在寻找的内容是:

> levels( df$v1, indata = TRUE )
[1] "a" "b" "c"

【问题讨论】:

  • ?droplevels
  • levels(droplevels(df$v1)) 显示非零级别或df$v1 &lt;- droplevels(df$v1) 将它们从数据框中删除。
  • @dcarlson, levels( droplevels( df$v1 ) ) 给出了我想要的结果并且很简单。谢谢!请把它作为一个答案,我会接受它。
  • 看来有人抢先了。

标签: r r-factor


【解决方案1】:

我们可能会使用droplevels

levels(droplevels(df$v1))
[1] "a" "b" "c"

或者只是再次包裹factor以重置levels

levels( factor(df$v1) )
[1] "a" "b" "c"

【讨论】:

  • 我原以为后者会将级别顺序重置为字母顺序,但显然情况并非如此(这很好): df "b" "a" "c"
  • @teppo 您使用了ordered,因为该属性未被删除
  • @teppo 即 class 在调用因子 &gt; class(df$v1)# [1] "ordered" "factor" &gt; class(factor(df$v1))# [1] "ordered" "factor" 后不会改变
  • 是的。我以为它只会查看数据,但实际上它也使用类信息。
【解决方案2】:

为什么不直接使用unique,然后使用子集来过滤掉 NA?

Filter(unique(df$v1, \(x) !is.na(x))

我们也可以使用基础子集:

unique(df$v1[!is.na(df$v1)])

或者我们可以使用purrr::discard

library(purrr)

unique(df$v1) %>% discard(is.na)

【讨论】:

  • 我不喜欢unique(),因为它不需要按级别顺序给出唯一值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 2020-02-29
  • 1970-01-01
相关资源
最近更新 更多