2015-12-16 21 views
15

Yinelenen satırların dizinlerini nasıl verimli bir şekilde eşleştirebilir/gruplayabilirim?Eşleşen/grup yinelenen satırlar (göstergeler)

ı bu veri seti var diyelim:

set.seed(14) 
dat <- data.frame(mtcars[sample(1:5, 14, TRUE), ])[sample.int(14), ] 
rownames(dat) <- NULL 
dat 

##  mpg cyl disp hp drat wt qsec vs am gear carb 
## 1 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
## 2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
## 3 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
## 4 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
## 5 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
## 6 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
## 7 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
## 8 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
## 9 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
## 10 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
## 11 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
## 12 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
## 13 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
## 14 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 

ben (ilk kopya dahil) yinelenenlerin tüm indisleri bulabilirsiniz

which_duplicated <- function(dat){ 
    which(duplicated(dat) | duplicated(dat[nrow(dat):1, ])[nrow(dat):1]) 
} 

which_duplicated(dat) 

## [1] 1 2 3 4 5 6 7 8 9 10 11 13 

kullanarak Ama maç için mümkün istiyorum Bu endeksler aşağıda görüldüğü gibidir:

Bunu nasıl verimli yapabilirim?

+1

'yavaş ama filtresini (fonksiyonu (x) uzunluğu (x)> 1 ile (dat, as.list (DAT), rownames)) – rawr

cevap

14

Burada "data.table" kullanarak bir olasılık:

library(data.table) 
as.data.table(dat)[, c("GRP", "N") := .(.GRP, .N), by = names(dat)][ 
        N > 1, list(list(.I)), by = GRP] 
## GRP    V1 
## 1: 1  1,4,5,6,9 
## 2: 2   2,13 
## 3: 3 3, 7, 8,10,11 

temel fikir bir sütun yaratmak olduğunu "grupları" (.GRP kullanarak) diğer sütunlar yanı sıra kaç kopyasını sayar bir sütun satırlar (.N kullanarak), daha sonra birden fazla kopyası olan ve "GRP" sütununu list'a yerleştiren her şeyi filtreleyebilir.

9

dplyr'u kullanabiliriz. @ AnandaMahto'nun gönderdiği benzer bir metodolojiyi kullanarak, tüm sütunlar tarafından bir satır indeks sütunu adı (add_rownames() oluşturuyoruz, filter her gruptaki satır sayısı 1'den büyük olan summarise 'rowname' olan bir list ve list sütununu ayıklayın.

library(dplyr) 
add_rownames(dat) %>% 
     group_by_(.dots= names(dat)) %>% 
     filter(n()>1) %>% 
     summarise(rn= list(rowname))%>% 
     .$rn 
#[[1]] 
#[1] "3" "7" "8" "10" "11" 

#[[2]] 
#[1] "2" "13" 

#[[3]] 
#[1] "1" "4" "5" "6" "9" 
+1

Her iki çözelti bir olmazdı çok iyi (aynı mantığı ' kendi başıma düşündüm) ve verimli. Ananda'nın çözümünü, ilk önce mantığa sahip olan yeşil onay ile işaretledim. Teşekkür ederim +1 –