2013-05-06 81 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

相關問題