2012-03-22 61 views
8

我是R新手,正試圖從大型數據框(50K行,215列)中刪除重複列。該框架混合了離散的連續變量和分類變量。識別R數據框中的重複列

我的做法已經產生在幀到列表中的每個列的表,然後使用duplicated()功能來查找那些重複列表的行,如下所示:

age=18:29 
height=c(76.1,77,78.1,78.2,78.8,79.7,79.9,81.1,81.2,81.8,82.8,83.5) 
gender=c("M","F","M","M","F","F","M","M","F","M","F","M") 
testframe = data.frame(age=age,height=height,height2=height,gender=gender,gender2=gender) 

tables=apply(testframe,2,table) 
dups=which(duplicated(tables)) 
testframe <- subset(testframe, select = -c(dups)) 

這ISN」非常有效,特別是對於大型連續變量。不過,我已經走了這條路,因爲我已經無法使用摘要,得到相同的結果(注意,以下假設原始testframe含重複):

summaries=apply(testframe,2,summary) 
dups=which(duplicated(summaries)) 
testframe <- subset(testframe, select = -c(dups)) 

如果運行的代碼,你會看到它只會刪除找到的第一個重複。我想這是因爲我做錯了什麼。任何人都可以指出我出錯的地方,或者更好的是,指出我有更好的方法來從數據框中刪除重複的列嗎?

回答

16

你可以用lapply做到:

testframe[!duplicated(lapply(testframe, summary))] 

summary總結分佈而忽略了秩序。

不是100%,但我會用消化,如果數據是巨大的:

library(digest) 
testframe[!duplicated(lapply(testframe, digest))] 
+2

除了@kohske的建議,使用'digest',它可能足以使用'C',而不是'蘇mmary'作爲'lapply'功能。 – BenBarnes 2012-03-22 08:18:21

+1

應該注意的是,字符向量的總結即使它們不同,也會產生相同的總結。這是因爲字符向量彙總只輸出向量的長度 – hshihab 2016-03-09 09:09:31

3
unique(testframe, MARGIN=2) 

不工作,但我認爲它應該,所以儘量

as.data.frame(unique(as.matrix(testframe), MARGIN=2)) 

,或者如果您擔心數字變成因素,

testframe[,colnames(unique(as.matrix(testframe), MARGIN=2))] 

產生

age height gender 
1 18 76.1  M 
2 19 77.0  F 
3 20 78.1  M 
4 21 78.2  M 
5 22 78.8  F 
6 23 79.7  F 
7 24 79.9  M 
8 25 81.1  M 
9 26 81.2  F 
10 27 81.8  M 
11 28 82.8  F 
12 29 83.5  M 
10

如何:

testframe[!duplicated(as.list(testframe))] 
+0

這是迄今爲止我用於測試數據框架上最快的方法 – Zelazny7 2016-04-14 01:10:02

2

一個好的技巧,您可以使用是轉你的數據幀,然後重複檢查。

duplicated(t(testframe)) 
-1

其實你只需要反轉重複,結果在你的代碼,並可能堅持使用subset(相比於括號標記恕我直言,這是更可讀)

require(dplyr) 
iris %>% subset(., select=which(!duplicated(names(.)))) 
0

下面是一個簡單的命令如果你的數據幀的重複列有相同的名稱,將工作:

testframe[names(testframe)[!duplicated(names(testframe))]]