【发布时间】:2013-10-18 19:56:01
【问题描述】:
所以,我有一个非常大的数据框,它有两列字符。字符是一些用“;”分隔的 ID 值。所以,我想计算这两列之间公共 ID 值的数量。这是一个例子:
id.x id.y
1 123;145;156 143;156;234;165
2 134;156;187;675 132;145;156;187
所以在这种情况下,第一行有一个公共值,第二行有两个公共值。
表大小为60M记录,部分字符串可能超过1000条。我尝试将数据写入文本文件,并通过 python 进行分析,但文件大小为 30GB。任何想法在 R 中做到这一点? (正则表达式,应用,..)
我可以通过这个命令来统计 rof 公共值的个数:
intersect(strsplit(df[1,"ind.x"], split=";")[[1]], strsplit(df[1,"ind.y"], split=";") [[1]])
因此,我写了一个函数:
myfun <- function(x,y) {
length(intersect(strsplit(x, split=";")[[1]], strsplit(y, split=";")[[1]]))
}
当我在一次调用中尝试它时有效,但是当我将它与下面的 mapply 一起使用时,它会打印所有列,但我只想要输出中的数字:
> mapply(FUN=myfun, df[1:2,]$id.x, df[1:2,]$id.y)
123;145;156 134;156;187;675
1 2
那么,为什么它也打印第一列?我的命令有什么问题?
【问题讨论】:
-
如果您只关心正在查看的行以外的任何内容,只需一次读取一个(或一次读取几个)并按此方式处理。一个 30GB 的文件需要 60-90GB 的内存,如果你想一次读取它...
-
那么,函数两个一次比较一行是什么?有四个循环?
-
我认为 Python 可能比 R 更有效,建议您将其添加为标签。 R 中有一些策略用于从串行连接进行分段读取,但它们相当笨拙。