如何根据因子中的级别从数据框中删除列?

时间:2015-09-14 13:47:13

标签: r

我创建了一个数据帧dd:

dd <- data.frame(a = factor(c(1,1,1,0,1,1)),
             b = factor(c(1,1,1,1,1,1)),
             c = factor(c(0,0,0,0,1,1)),
             d = factor(c(0,0,0,0,0,0)),
             e = factor(c(0,0,0,NA,0,0)))

给你这个:

> dd
  a b c d    e
1 1 1 0 0    0
2 1 1 0 0    0
3 1 1 0 0    0
4 0 1 0 0 <NA>
5 1 1 1 0    0
6 1 1 1 0    0

我想创建第二个数据框,其中只包含每个因子有多个级别的列。我试过这个:

dd2 <- dd[, sapply(dd, function(col) length(unique(col))) > 1]

给出了这个:

> dd2
  a c    e
1 1 0    0
2 1 0    0
3 1 0    0
4 0 0 <NA>
5 1 1    0
6 1 1    0

正如您所看到的,这有点奏效,但问题是缺少数据。为了得到我想要的列e也需要摆脱它。

有没有人对我如何解决这个或其他方式有任何建议?

非常感谢任何帮助。 非常感谢, 尼基

2 个答案:

答案 0 :(得分:5)

我们可以使用Filter。我们可以检查每列的方差(var)。如果列的var为0,则会强制转换为FALSE,而其他列将为TRUE。作为&#39; dd&#39;中的列是factor,我们得到整数水平的方差。

Filter(var, dd)

如果有NA个值,我们可以在na.rm=TRUE中使用参数var

Filter(function(x) var(x, na.rm=TRUE), dd1)

但是,通常情况下,最好使用length(unique路线,因为这也适用于character列。 使用length(unique(,我们会将length个{NA}元素unique的{​​{1}}列保持在大于1的位置。

na.omit

答案 1 :(得分:3)

这里使用nlevels函数来计算因子的级别数,而不是尝试计算唯一值的数量,这样更正确(也更有效)。

> dd[, sapply(dd, function(col) nlevels(col) > 1)]
  a c
1 1 0
2 1 0
3 1 0
4 0 0
5 1 1
6 1 1