我创建了一个数据框 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 列也需要被删除。
有没有人对我如何解决这个问题或其他方法有任何建议?
非常感谢任何帮助。 非常感谢, 尼基
最佳答案
我们可以使用过滤器
。我们可以检查每列的方差 (var
)。如果列的 var 为 0,它将被强制为 FALSE
,而所有其他列将为 TRUE
。由于 'dd' 中的列是 factor
,我们得到整数水平的方差。
Filter(var, dd)
如果有 NA
值,我们可以在 var
中使用参数 na.rm=TRUE
。
Filter(function(x) var(x, na.rm=TRUE), dd1)
但是,一般来说,最好使用 length(unique
路由,因为这也适用于 character
列。
使用 length(unique(
,我们保留 unique
非 NA 元素的 length
的列 (na.omit
) 大于 1。
Filter(function(x) length(unique(na.omit(x)))>1, dd)
关于r - 如何根据一个因素的水平从数据框中删除列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32566471/