2011-05-07 97 views
2

在R中,我想以儘可能最快的方式找到數據幀唯一行的出現次數。查找行的出現次數

我有超過200萬行,但數據適合我的16GB內存機器 表和ftable速度快,但唯一組合的數量超過他們可以處理,因此我收到一條錯誤消息。

感謝

史蒂夫

回答

1

如果問題是得到的唯一的行數:

sum(!duplicated(dfrm)) 

如果問題是,以獲得獨特的線本身:

dfrm[!duplicated(dfrm), ] 

如果你想要一個獨特的組合表,然後考慮這個例子與inbu ilt dataframe cars:

cars2 <- cars[sample(1:10, 20, replace=TRUE), ] # to make some dups 
table(apply(cars2,1,paste, sep=".", collapse=".")) 

# output # 
10.18 10.26 10.34 11.17 4.10 4.2 7.22 7.4 8.16 
    2  3  3  3  3  1  1  2  2 
+0

我不認爲這會帶來頻率。這帶來了唯一行的總數。 – 2011-05-07 04:06:55

+0

我認爲你需要更清楚地寫下你的問題 - 很難理解你要求的內容。 – wch 2011-05-07 05:31:33

+0

wch:這怎麼能更清楚?我寫道:「我希望以最快的方式找到數據幀唯一行的出現次數。」 – 2011-05-07 12:54:47

1

這個問題可以使用SQL(這裏我使用sqldf包)來解決。來自@DWin回答的樣本數據。

#Occurences of rows 
sqldf("SELECT speed, dist, COUNT(*) AS N FROM cars2 GROUP BY speed, dist") 
#Some statistics of occurences ;) 
sqldf("SELECT N,COUNT(N) AS Freq from 
      (SELECT COUNT(*) AS N FROM cars2 GROUP BY speed,dist) 
     GROUP BY N") 
3

使用plyr包中的count。它避免了數據中不存在的組合(與表格等相反)。

+0

尼克,我不知道這我會看看plyr包。 – 2011-05-09 14:20:49

+0

確實很快。當然,R在內存中工作,如果所有的數據都可以在內存中,這是一個不錯的選擇。 – 2011-05-09 21:17:45

0
countNbOccurrences = function(leX, leGroData){ 
    return(sum(leX == leGroData)) 
} 

sapply(theRow, countNbOccurrences, leGroData = fullListOfRows)