提取因子水平时出现意外行为

3

有人能解释一下为什么levels()函数显示三个因子水平,而你可以看到向量只有两个吗?

> str(walk.df)
'data.frame':   10 obs. of  4 variables:
 $ walker : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 2 2 2 2 2

> walk.df$walker
 [1] 1 1 1 1 1 2 2 2 2 2
Levels: 1 2 3

我希望提取一个级别向量,我认为这是正确的方法,但是你可以看到,有一个三混进去了,这会破坏我的功能。

> as.numeric(levels(walk.df$walker))
[1] 1 2 3

“...显示三个变量”,也许你的意思是“值”或“级别”? - aL3xa
你说得对,我是指关卡。 - Roman Luštrik
1
回顾过去,现在可以在子集对象上使用droplevels()并完全避免出现此问题。 - Roman Luštrik
回顾一下, [ 方法有 drop 参数。哦,你知道的... @kohske 已经搞定了。RTFM @aL3xa,RTFM... - aL3xa
2个回答

9

很可能walk.df是一个包含3个级别的因子变量的子集。

a<-factor(1:3)
b<-a[1:2]

那么b就有3个层级。

删除额外层级的简单方法是:

b<-a[1:2, drop=T]

如果您无法访问原始变量,

b<-factor(b)

你说得对,它是一个子集。我一直在切割对象,以至于忘记了我正在从原始对象中采样 - 它有三个级别。 - Roman Luštrik

0

你可以为包含两个水平的因子分配多个因子水平:

 > set.seed(1234)
 > x <- round(runif(10, 1, 2))
 > x
  [1] 1 2 2 2 2 2 1 1 2 2
 > y <- factor(x)
 > levels(y)
 [1] "1" "2"
 > levels(y) <- c("1", "2", "3")
 > y
  [1] 1 2 2 2 2 2 1 1 2 2
 Levels: 1 2 3

甚至可能根本没有等级:

 > p <- NA
 > q <- factor(p)
 > levels(q)
 character(0)
 > levels(q) <- c("1", "2", "3")
 > q
 [1] <NA>
 Levels: 1 2 3

我真正想要的是提取子集中出现的级别。我已经通过list.of.walkers <- sort(unique(walk.df$label))解决了这个问题。 - Roman Luštrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接