我在數據框中有兩列,並且我能夠使用unique()
刪除所有重複的行 - 處理一個款待。刪除在不同列中具有重複值的行
但現在我想刪除行是的值是相同的,不管他們是在哪一列。像...
data1 data2
data3 data2
data2 data1
data2 data3
應自行簡化爲
data1 data2
data3 data2
3和4與1和2相同。
任何想法?
我在數據框中有兩列,並且我能夠使用unique()
刪除所有重複的行 - 處理一個款待。刪除在不同列中具有重複值的行
但現在我想刪除行是的值是相同的,不管他們是在哪一列。像...
data1 data2
data3 data2
data2 data1
data2 data3
應自行簡化爲
data1 data2
data3 data2
3和4與1和2相同。
任何想法?
首先排序列方向(使用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"
我會創建一個新列與您已粘貼在一起的排序列,然後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 @Andrie適用於清潔使用。有趣的是,我編譯的函數大約需要439微秒,對於4行的小例子表格,這個應用需要515微秒。然而,對於4000行的表格,這是另一種方式,在3.45ms和2.92ms。總體上比我預期的差異更小。 – Sean