2016-10-27 84 views
3

我有以下設置(玩具例如,如果我的真正的問題):如何高效地找到R中數據幀的交叉點索引?

data1 = data.frame(cbind(1:8,1:8+3,1:8+5)) 
data2 = data.frame(rbind(c(4,7,9),c(7,10,12))) 

從而

> data1 
    X1 X2 X3 
1 1 4 6 
2 2 5 7 
3 3 6 8 
4 4 7 9 
5 5 8 10 
6 6 9 11 
7 7 10 12 
8 8 11 13 

> data2 
    X1 X2 X3 
1 4 7 9 
2 7 10 12 

我如何才能找到索引如果行data2 in data1高效?上例中的結果應該是c(4,7)。 我試過循環,但這太低效了。謝謝你的幫助!

+2

下面是不同的方法之間的一個整數的比較。您可以輕鬆調整它們以找到相同的行,而不是差異。 https://www.r-bloggers.com/identifying-records-in-data-frame-a-that-are-not-contained-in-data-frame-b-%E2%80%93-a-comparison/ –

回答

4

我們可以使用which%in%

which(do.call(paste, data1) %in% do.call(paste, data2)) 
#[1] 4 7 

或做加盟

library(data.table) 
setDT(data1, keep.rownames = TRUE)[data2, on = names(data2)]$rn 
#[1] "4" "7" 
+3

只是一個精確。對於'setDT',你需要加載'data.table'包。它不是基本功能 – cderv

3

另一個基礎R的做法是這樣的:

x <- rbind(data1, data2) 
which(duplicated(x, fromLast=TRUE)) 

#[1] 4 7 

和非基地-R方法,它給你正確的結果(不是行數,而是數值)行)

library(compare) 
comparison <- compare(data1,data2,allowAll=TRUE) 
comparison$tM 
#  X1 X2 X3 
# 1 1 4 6 
# 2 2 5 7 
+4

data.frame的'duplicateated'方法與@ akrun的答案類似,使用'paste'。此外,如果'data1'包含'data2'中不存在的重複行,那麼您的行可能會帶來誤報。 – nicola

3

隨着dplyr

data1 = data.frame(cbind(1:8,1:8+3,1:8+5)) 
data2 = data.frame(rbind(c(4,7,9),c(7,10,12))) 
library(dplyr) 
data1 %>% 
    # add a row id 
    mutate(rowID = row_number()) %>% 
    # keep only rows of data1 that are in data2 
    semi_join(data2) %>% 
    # keep one row ID 
    select(rowID) 
#> Joining, by = c("X1", "X2", "X3") 
#> rowID 
#> 1  4 
#> 2  7