1

我有两个数据框,A 和 B。

a1 <- c(12, 12, 12, 23, 23, 23, 34, 34, 34)
a2 <- c(1, 2, 3 , 2, 4 , 5 , 2 , 3 , 4)
A <- as.data.frame(cbind(a1, a2))

b1 <- c(12, 23, 34)
b2 <- c(1, 2, 2)
B <- as.data.frame(cbind(b1, b2))

> A
  a1 a2
1 12  1
2 12  2
3 12  3
4 23  2
5 23  4
6 23  5
7 34  2
8 34  3
9 34  4
> B
  b1 b2
1 12  1
2 23  2
3 34  2

基本上,B 包含 A 中的行,每个唯一 a1 的 a2 的最低值。

我需要做的很简单。找到行索引(或行号?)让我们将其称为 index.vector,使得 A[index.vector, ] 等于 B。

对于这个特定问题,只有一个解决方案,因为对于 a1 的每个唯一值,a2 中没有相同的值。

例行程序越快越好。需要将其应用于具有 500 到数百万行之间的任何数据帧。

4

1 回答 1

0

我会确保我的数据首先排序(在您的示例中,数据的排序正确,但我想这可能并非总是如此),然后使用matchwhich 在它的第二个参数中返回它的第一个参数的第一个匹配的索引(或者NA如果没有匹配)。

A <- A[ order( A$a1 , A$a2 ) , ]
A
#  a1 a2
#1 12  1
#2 12  2
#3 12  3
#4 23  2
#5 23  4
#6 23  5
#7 34  2
#8 34  3
#9 34  4

#  Get row indices for required values
match( B$b1 , A$a1 )
[1] 1 4 7

这是一个 data.table 解决方案,对于大型表来说应该更快

require(data.table)
A <- data.table( A )
B <- data.table( B )

#  Use setkeyv to order the tables by the values in the first column, then the second column
setkeyv( A , c("a1","a2") )
setkeyv( B , c("b1","b2") )

#  Create a new column that is the row index of A
A[ , ID:=(1:nrow(A)) ]

#  Join A and B on the key columns (this works because you have unique values in your second column for each grouping of the first), giving the relevant ID
A[B]
#   a1 a2 ID
#1: 12  1  1
#2: 23  2  4
#3: 34  2  7
于 2013-06-07T14:48:57.723 回答