查找与多个值

时间:2016-10-02 08:08:14

标签: r replace data-cleaning

假设有一个具有以下数据帧:

x=data.frame(c(1,1,2,2,2,3),c("A","A","B","B","B","B"))
names(x)=c("v1","v2")

x
  v1 v2
1  1  A
2  1  A
3  2  B
4  2  B
5  2  B
6  3  B

在此数据框中,v1中的值我想与v2中的标签对应。但是,正如在此示例中可以看到的,B具有多个对应值。

是否有任何优雅而快速的方法可以找到v2中的哪些标签与v1中的多个值相对应?

我希望理想地显示的结果,值 - 在我们的示例中应该是c(2,3) - 以及行号 - 在我们的示例中应该是r=c(5,6)

1 个答案:

答案 0 :(得分:3)

假设我们希望“v1”中的唯一元素的索引按“v2”分组并且应该具有多个唯一元素,我们使用ave创建逻辑索引并使用它来对行进行子集化'x'。

i1 <- with(x, ave(v1, v2, FUN = function(x) 
    length(unique(x))>1 & !duplicated(x, fromLast=TRUE)))!=0
x[i1,]
#   v1 v2
#5  2  B
#6  3  B

或者更快的选项是data.table

library(data.table)
i1 <- setDT(x)[, .I[uniqueN(v1)>1 & !duplicated(v1, fromLast=TRUE)], v2]$V1
x[i1, 'v1', with = FALSE][, rn := i1][]
#   v1 rn
#1:  2  5
#2:  3  6