获取未删除索引行的向量

时间:2015-07-18 15:52:43

标签: r

我有两个数据框,它们最初具有相同的元素但在消除其中一个中的某些行之后的长度不同。

x <-c(4,2,3,6,7,3,1,8,5,2,4,1,2,6,3)
y <-c(1,4,2,3,6,7,3,1,8,5,2,3,1,4,3)
z <-c(4,2,3,1,8,5,2,4,1)
k <-c(1,4,2,3,1,8,5,2,3)

df1 <- data.frame(x,y)
df2 <- data.frame(z,k)

我想在第二个数据框(df2)中找到一种方法来创建一个行,或者使用第一个数据帧(df1)的索引行号进行索引引用,这样就会产生一个新的数据帧,如下所示: (a将是df1的索引引用)。

  df3
   a z k
1  1 4 1
2  2 2 4
3  3 3 2
4  7 1 3
5  8 8 1
6  9 5 8
7  10 2 5
8  11 4 2
9  12 1 3

我可以手动创建所有已删除行或使用

的列
library(sqldf)
a1NotIna2 <- (sqldf('SELECT * FROM df1 EXCEPT SELECT * FROM df2'))
a1NotIna2 

  x y
1 2 1
2 3 3
3 3 7
4 6 3
5 6 4
6 7 6

我尝试在最后一个表达式中使用-which- without sucess来找出被删除的df1行,用于从长度等于df1的序列向量中删除那些常见元素以获得带有向量的向量该指数类似于df3

欢迎任何帮助

2 个答案:

答案 0 :(得分:2)

如果您的data.frames有两列,使用pmatch

,则为通用解决方案
transform(df2, a=pmatch(do.call(paste0, df2), do.call(paste0, df1)))
#  z k  a
#1 4 1  1
#2 2 4  2
#3 3 2  3
#4 1 3  7
#5 8 1  8
#6 5 8  9
#7 2 5 10
#8 4 2 11
#9 1 3 12

答案 1 :(得分:1)

您可以为df2中的每一行获取match(paste(df2$z, df2$k), paste(df1$x, df1$y)) # [1] 1 2 3 7 8 9 10 11 7 的第一个匹配行:

df2

不幸的是,当你有重复的行时,这不会维持排序,所以例如我们得到SSLEngine on SSLProtocol +TLSv1.2 +TLSv1.1 +TLSv1 -SSLv2 -SSLv3 SSLCompression Off SSLHonorCipherOrder on SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH 的最后一行的索引7而不是12。