2013-05-06 95 views
2

我有一个数据集,其中有几个变量只有一个唯一的观察值(例如对于数据集中的每个观测值,变量Language等于“英语”)。我试图编写一个函数,它自动找到任何这种性质的变量并将其从数据框中移除。下面的代码有效,但我确信有一个更有效的方法来做到这一点。有任何想法吗?如何删除R中没有多个不同观察值的所有变量?

test.df <- data.frame(var1=rep("a",5), var2=c(rep("a",3),rep("b",2)), 
         var3=1:5, var4=rep(0,5)) 

remove.repeat.vars <- function(data) { 
    one.level.factors <- sapply(data, function(x) ifelse(length(unique(x)) < 2, 1, 0)) 
    one.level.factors <- names(one.level.factors[which(one.level.factors == 1)]) 
    return (data[,-which(names(data) %in% one.level.factors)]) 
} 

remove.repeat.vars(test.df) 

回答

4

一个内胆:

test.df[, sapply(test.df, function(x) length(unique(x)) > 1)] 

这是为什么它的工作原理。 R支持两种不同的方式来索引向量:索引向量(任意长度)或布尔向量。比较:

> x <- 6:10 
> x[c(1,3,5)] 
[1] 6 8 10 
> x[c(TRUE, FALSE, FALSE, TRUE, FALSE)] 
[1] 6 9 

第二个是为什么像x[x>7]的工作。

+0

真棒。所以sapply吐出一个逻辑向量,并使用子集括号来选择只有逻辑为“TRUE”的列。我尝试了很多这样的东西,但无法让它起作用,但现在它在我的面前,我不敢相信我需要这方面的帮助。 – zap2008 2013-05-06 18:08:35

+0

感谢您的额外解释! – zap2008 2013-05-06 18:09:24

+0

很高兴帮助! R确实有一些棘手的问题。 – 2013-05-06 18:10:08

相关问题