2012-06-16 64 views
1

我在数据框中有两列,并且我能够使用unique()删除所有重复的行 - 处理一个款待。删除在不同列中具有重复值的行

但现在我想删除行是的值是相同的,不管他们是在哪一列。像...

data1 data2 
data3 data2 
data2 data1 
data2 data3 

应自行简化为

data1 data2 
data3 data2 

3和4与1和2相同。

任何想法?

回答

3

首先排序列方向(使用applysort)的每一行,然后使用unique

dat <- read.table(text=" 
data1 data2 
data3 data2 
data2 data1 
data2 data3") 

unique(t(apply(dat, 1, sort))) 
    [,1] [,2] 
[1,] "data1" "data2" 
[2,] "data2" "data3" 
+0

+1 @Andrie适用于清洁使用。有趣的是,我编译的函数大约需要439微秒,对于4行的小例子表格,这个应用需要515微秒。然而,对于4000行的表格,这是另一种方式,在3.45ms和2.92ms。总体上比我预期的差异更小。 – Sean

0

我会创建一个新列与您已粘贴在一起的排序列,然后unique()。

# create some dummy data 
adf <- data.frame(colA=c('data1', 'data3', 'data2', 'data2'), 
     colB=c('data2', 'data2', 'data1', 'data3'), stringsAsFactors=FALSE) 

# function to fix up this data... 
# can't see a way of avoiding the loop at the moment, but I'm sure somebody will! 
fixit <- function(adf) { 
    nc <- vector(mode='character', length=nrow(adf)) 
    for (i in 1:nrow(adf)) { 
    nc[i] <- paste(sort(c(adf[i,1], adf[i,2])), collapse='') 
    } 
    adf[!duplicated(nc),] 
} 
fixit(adf) 

具有循环将是一个很大的data.frame慢,但它可以通过使用

library(compiler) 
faster.fixit <- cmpfun(fixit) 
faster.fixit(adf) 

我知道这是稍微偏离主题被加快,但有趣的是,当我这个基准循环功能,字节编译版本更快只有约5%

# create a bigger test data.frame 
N <- 10 
adf.bigger <- data.frame(colA=rep(adf$colA, N), colB=rep(adf$colB, N), 
       stringsAsFactors=FALSE) 

N <- 1000 
adf.biggest <- data.frame(colA=rep(adf$colA, N), colB=rep(adf$colB, N), 
       stringsAsFactors=FALSE) 

library(microbenchmark) 
microbenchmark(fixit(adf), faster.fixit(adf), times=1000L) 
microbenchmark(fixit(adf.bigger), faster.fixit(adf.bigger), times=1000L) 
microbenchmark(fixit(adf.biggest), faster.fixit(adf.biggest), times=100L) 
+1

什么是'comfun'?这应该是'cmpfun'吗? – GSee

+0

@你完全正确 - 编辑 – Sean

相关问题