我有两组:A列x,y和B也有列x,y。
我需要找到B内部的A行的索引(x和y必须匹配)。
我提出了一个简单的解决方案(见下文),但这个比较是在循环内部,paste
增加了更多的额外时间。
B <- data.frame(x = sample(1:1000, 1000), y = sample(1:1000, 1000))
A <- B[sample(1:1000, 10),]
#change some elements
A$x[c(1,3,7,10)] <- A$x[c(1,3,7,10)] + 0.5
A$xy <- paste(A$x, A$y, sep='ZZZ')
B$xy <- paste(B$x, B$y, sep='ZZZ')
indx <- which(A$xy %in% B$xy)
indx
例如,对于单个观察,paste
的替代方案几乎快3倍
ind <- sample(1:1000, 1)
xx <- B$x[ind]
yy <- B$y[ind]
ind <- which(with(B, x==xx & y==yy))
# [1] 0.0160000324249268 seconds
xy <- paste(xx,'ZZZ',yy, sep='')
ind <- which(B$xy == xy)
# [1] 0.0469999313354492 seconds
答案 0 :(得分:2)
如何使用merge()
为您进行匹配?
A$id <- seq_len(nrow(A))
sort(merge(A, B)$id)
# [1] 2 4 5 6 8 9
修改强>
或者,要摆脱两个不必要的排序,请使用sort=
选项merge()
merge(A, B, sort=FALSE)$id
# [1] 2 4 5 6 8 9