1

データフレームに2つの列があり、重複するすべての行を削除することができましunique( )た。

しかし、今度は、どの列にあるかに関係なく、値が同じである行を削除したいと思います。

data1    data2
data3    data2
data2    data1
data2    data3

に簡略化する必要があります

data1    data2
data3    data2

行3と4は1と2と同じだからです。

何か案は?

4

2 に答える 2

3

最初に各行を列ごとに並べ替え(applyとを使用sort)、次に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"
于 2012-06-16T10:34:45.850 に答える
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)

ビッグデータフレームではループが遅くなりますが、

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)
于 2012-06-16T09:45:07.800 に答える