2017-09-06 59 views
0

我試圖擺脫一個數據框/矩陣的值不同的其他值/類。這種彙總方法是否可以有效地處理數百萬的數據?

即下面是一個例子初始表:

P | V 
------ | ------ 
par | 123 
par | 1234 
par | 12345 
par | 123456 
pat | 123 
pat | 1234 
pat | 12345 
pat | 1234567 
pay | 123456 
pay | 789 
pay | 967 

正如你可以看到有一些是獨特的和不同的一些P列的值的值(V列)。這些值是

P | V 
------ | ------ 
pat | 1234567 
pay | 789 
pay | 967 

並且這是預期的輸出。

爲了得到這個,我使用了聚合函數(見下文)),但實際的數據將會大得多。他們可以達到2-3百萬行,甚至更多。

您是否認爲下面的代碼可以工作並響應這麼多的數據,還有另一種方法可以提高效率?

mat = c("par","par","par","par","pat","pat","pat","pat","pay","pay","pay") 
mat = as.data.frame(cbind("P"=mat, "V"=c("123","1234","12345","123456","123","1234","12345","1234567","123456","789","967"))) 

uniquePs = matrix(unique(mat$P)) 
diff = aggregate(P~V, mat, FUN=unique) 
distinctVs = diff[which(grepl(":|," , as.character(diff$P)) == FALSE),] 
distinctVs$P = uniquePs[as.numeric(distinctVs$P)] 

謝謝。

+0

你的意思'長度(diff $ P)> 1'而不是'grepl' – akrun

+0

是的。這也可以起作用 –

回答

4

以下是您可以使用的不同方法。它應該確定在效率方面爲2-3萬行:

subset(df, ave(as.character(P), V, FUN = function(x) length(unique(x))) == 1L) 
#  P  V 
#8 pat 1234567 
#10 pay  789 
#11 pay  967 

下面是基礎R一個更簡單的方法:

subset(unique(df), !(duplicated(V) | duplicated(V, fromLast = TRUE))) 
#  P  V 
#8 pat 1234567 
#10 pay  789 
#11 pay  967 
+0

比你們都非常非常。我會給他們一個嘗試,並決定哪個更快。 –

4

也許我們需要

library(data.table) 
setDT(df1)[, .SD[uniqueN(P)==1], V] 
#  V P 
#1: 1234567 pat 
#2:  789 pay 
#3:  967 pay 
相關問題