如何有效地找到R中数据帧的交叉点的索引?

时间:2016-10-27 09:44:44

标签: 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中的data1行有效,我怎样才能找到索引?上面示例中的结果应为c(4,7)。 我试过循环,但这太低效了。谢谢你的帮助!

3 个答案:

答案 0 :(得分:4)

我们可以将[0, 1, 2, 3, 4, 5, 6][0, 1, 2, 3, 4, 5 ,6]

一起使用
which

或者加入

%in%

答案 1 :(得分: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

答案 2 :(得分: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