删除重复项需要转置,但我的数据帧太大

时间:2016-07-30 02:07:40

标签: r dataframe duplicates transpose

我问了一个问题here。我有一个简单的数据框,我试图删除重复项。非常基本的问题。

Akrun给出了一个很好的答案,就是使用这一行:

df[!duplicated(data.frame(t(apply(df[1:2], 1, sort)), df$location)),]  

我继续这样做,这对假人问题起了很大的作用。但我有350万条记录,我试图过滤。

为了查看瓶颈所在,我将代码分解为步骤。

step1 <- apply(df1[1:2], 1, sort)
step2 <- t(step1)
step3 <- data.frame(step2, df1$location)
step4 <- !duplicated(step3)
final <- df1[step4, ,]  
步骤1看起来很长一段时间,但它并不是最糟糕的罪犯 然而,第2步显然是罪魁祸首。

所以我在不幸的情况下,我正在寻找一种在R中转换350万行的方法。(或者可能不在R中。希望有一些方法可以在某处进行)。< / p>

环顾四周,我看到了一些想法

  • 安装具有transposeBigData功能的WGCNA库。不幸的是,这个包不再被维护,我无法安装所有依赖项。

  • 将数据写入csv,然后逐行读取,并一次转置一行。对我来说,甚至写文件一夜之间没有完成。

这真的很奇怪。我只想删除重复项。出于某种原因,我必须在此过程中转置数据帧。但是我无法将这么大的数据帧转置。

所以我需要一个更好的策略来删除重复项或转置。有没有人对此有任何想法?

顺便说一句,我使用Ubuntu 14.04,带有15.6 GiB RAM,cat /proc/cpuinfo返回

Intel(R)Core(TM)i7-3630QM CPU @ 2.40GHz
型号名称:Intel(R)Core(TM)i7-3630QM CPU @ 2.40GHz
cpu MHz:1200.000
缓存大小:6144 KB

感谢。

df <- data.frame(id1 = c(1,2,3,4,9), id2 = c(2,1,4,5,10), location=c('Alaska', 'Alaska', 'California', 'Kansas', 'Alaska'), comment=c('cold', 'freezing!', 'nice', 'boring', 'cold'))

2 个答案:

答案 0 :(得分:2)

更快的选择是将pmin/pmaxdata.table

一起使用
library(data.table)
setDT(df)[!duplicated(data.table(pmin(id1, id2), pmax(id1, id2)))]
#     id1 id2   location comment
#1:   1   2     Alaska    cold
#2:   3   4 California    nice
#3:   4   5     Kansas  boring
#4:   9  10     Alaska    cold

如果&#39; location&#39;还需要包含以查找unique

setDT(df)[!duplicated(data.table(pmin(id1, id2), pmax(id1, id2), location))]

答案 1 :(得分:1)

所以在周末的大部分时间里为此奋斗(感谢来自杰出的@akrun的大量无私帮助),我意识到我需要以完全不同的方式解决这个问题。

由于数据帧太大而无法在内存中处理,我最终使用的策略是将(字符串)键粘贴在一起并将其列绑定到数据帧上。接下来,我折叠了密钥并对字符进行了排序。在这里,我可以使用which来获取包含非重复键的行的索引。有了这个,我可以过滤我的数据帧。

df_with_key <- within(df,  key <- paste(boxer1, boxer2, date, location, sep=""))

strSort <- function(x)
  sapply(lapply(strsplit(x, NULL), sort), paste, collapse="")

df_with_key$key <- strSort(df_with_key$key)

idx <- which(!duplicated(df_with_key$key))

final_df <- df[idx,]