在R中找到集合的交集

时间:2014-02-27 19:03:26

标签: r indexing dataframe intersection

我有以下数据帧,并希望从该数据帧返回索引,该数据帧对应于向量[1 1 1 1 0 0 1]。 FUNC。在这种情况下应该返回5。

  

1:0 0 1 1 0 0 1

     

2:1 0 1 1 0 0 1

     

3:2 0 1 1 0 0 1

     

4:0 1 1 1 0 0 1

     

5:1 1 1 1 0 0 1

     

6:2 1 1 1 0 0 1

     

7:0 0 2 1 0 0 1

如果我们有另一个由

组成的data.frame怎么办?
  

1:0 0 2 1 0 0 1 == 7

     

2:0 1 1 1 0 0 1 == 4

     

2:2 0 1 1 0 0 1 == 3

     

4:2 0 1 1 0 0 1 == 3

     

5:2 1 1 1 0 0 1 == 6

我希望函数返回7,4,3,3,6。我想在不使用循环的情况下完成此任务。谢谢!

2 个答案:

答案 0 :(得分:1)

对于第二个问题(也是第一个问题,因为你可以在数据框中添加你想要的任何行)问题:

mydf$rownum <- 1:nrow(mydf)
merge(mydf.sub, mydf, sort=F)[[8]]

产地:

[1] 7 4 3 3 6

或没有[[8]]

  V1 V2 V3 V4 V5 V6 V7 rownum
1  0  0  2  1  0  0  1      7
2  0  1  1  1  0  0  1      4
3  2  0  1  1  0  0  1      3
4  2  0  1  1  0  0  1      3
5  2  1  1  1  0  0  1      6

如果您想要解决第一个问题的答案:

merge(rbind(mydf.sub, c(1, 1, 1, 1, 0, 0, 1)), mydf, sort=F)

产地:

  V1 V2 V3 V4 V5 V6 V7 rownum
1  0  0  2  1  0  0  1      7
2  0  1  1  1  0  0  1      4
3  2  0  1  1  0  0  1      3
4  2  0  1  1  0  0  1      3
5  2  1  1  1  0  0  1      6
6  1  1  1  1  0  0  1      5

可重复数据(感谢Ananda的第一部分):

structure(list(V1 = c(0L, 0L, 2L, 2L, 2L), V2 = c(0L, 1L, 0L, 
0L, 1L), V3 = c(2L, 1L, 1L, 1L, 1L), V4 = c(1L, 1L, 1L, 1L, 1L
), V5 = c(0L, 0L, 0L, 0L, 0L), V6 = c(0L, 0L, 0L, 0L, 0L), V7 = c(1L, 
1L, 1L, 1L, 1L)), .Names = c("V1", "V2", "V3", "V4", "V5", "V6", 
"V7"), class = "data.frame", row.names = c(NA, -5L))

答案 1 :(得分:0)

apply可能对第一个问题有用:

# Actual reproducible data!
mydf <- structure(list(V1 = c(0L, 1L, 2L, 0L, 1L, 2L, 0L), V2 = c(0L, 
    0L, 0L, 1L, 1L, 1L, 0L), V3 = c(1L, 1L, 1L, 1L, 1L, 1L, 2L), 
    V4 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L), V5 = c(0L, 0L, 0L, 0L, 
    0L, 0L, 0L), V6 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L), V7 = c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L)), .Names = c("V1", "V2", "V3", "V4", 
    "V5", "V6", "V7"), class = "data.frame", row.names = c(NA, -7L))
myvec <- c(1, 1, 1, 1, 0, 0, 1)

将每一行与“myvec”对象进行比较。使用which找出哪一行返回TRUE

apply(mydf, 1, function(x) all(x == myvec))
# [1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
which(apply(mydf, 1, function(x) all(x == myvec)))
# [1] 5