我已经挣扎了一段时间,我找不到出路 . 这是我的问题 .
我有2个数据帧:
df1 <- data.frame(replicate(3,sample(1:10,20,rep=TRUE)))
df1
X1 X2 X3
1 10 1 9
2 3 4 2
3 7 6 8
4 8 10 7
5 5 7 5
6 8 5 9
7 9 8 4
8 6 2 7
9 2 9 6
10 5 2 9
df2 <- data.frame(df1[sample(nrow(df1),4), ])
df2
X1 X2 X3
8 6 2 7
3 7 6 8
10 5 2 9
7 9 8 4
我想创建一个长度为(x)=长度(df1)的向量x,每df1行包含df2中相应行的行索引(即df1和df2之间每列的相同精确值) .
考虑一下:
dim(df1)
[1] 1096188 3
dim(df2)
[1] 256 3
并且df1有几行具有相同的值(即相应的行索引将是相同的),并且原则上df1中的所有行应该找到与df2中的行匹配 .
预期的产出是:
x
[1] 0 0 2 0 0 0 4 1 0 3
希望这很清楚......
你能帮我吗?
谢谢,
PIERA
4 回答
我试试:
关于它的期望输出有很多讨论;在@CathG解释中,这一行产生它:
这是
data.table
的一个选项:结果x(包含您的数据):
Another, more simple and efficient option, suggested by @Frank:
Some benchmark between @nicola answer, @Frank suggestion and my answer, on a 100000 rows df1 and 200 rows df2 ,略微修改了nicola获得所需输出的答案(两个函数都给出了相同的结果,除了需要
as.numeric
为nicola的):所以:
我意识到这是一个非常古老的问题的新答案,但是有什么问题
??
输出是
所以有
NA
而不是0
s,但我认为这是一个单行,也不需要do.call()
或其他任何东西 .在您的示例中,df1中的行在df2中都不匹配(例如,第1行) . 但是,假设他们这样做(也许df1中有多次出现多次行),你可以:
df1中实际上不在df2中的任何行都将保留为值0.也许不是最快的解决方案 - 您需要多少次重复该过程?