我创建了一个数据帧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也需要摆脱它。
有没有人对我如何解决这个或其他方式有任何建议?
非常感谢任何帮助。 非常感谢, 尼基
答案 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