我问了一个问题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'))
答案 0 :(得分:2)
更快的选择是将pmin/pmax
与data.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,]