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



我在这里问了一个问题。我有一个简单的数据帧,我试图删除重复的数据帧。非常基本的问题。

阿克伦给出了一个很好的答案,那就是使用这条线:

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, ,]  

第一步看起来很长时间了,但它并不是最糟糕的罪犯
然而,第二步显然是罪魁祸首。

因此,我正处于一种不幸的情况,我正在寻找一种在R中转置350万行的方法。

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

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

  • 将数据写入csv,然后逐行读取,并一次一行地转换每一行。对我来说,即使是写文件也要通宵运行,没有完成。

这真的很奇怪。我只想删除重复项。出于某种原因,我不得不在这个过程中转换一个数据帧。但是我不能转换这么大的数据帧。

所以我需要一个更好的策略,要么删除重复,要么转座。有人对此有什么想法吗?

顺便说一下,我使用的是Ubuntu 14.04,有15.6 GiB的RAM,cat /proc/cpuinfo会返回

英特尔(R)酷睿(TM)i7-3630QM CPU@2.40GHz
型号名称:Intel(R)Core(TM)i7-3630QM CPU@2.40GHz
cpu兆赫: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'))

更快的选择是使用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

如果还需要包括"位置"以查找unique

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

因此,在周末的大部分时间里(感谢杰出的@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,]

最新更新