2013-10-18 57 views
0

所以,我有非常大的数据框,它有两列字符。字符是用“;”分隔的一些ID值。所以,我想计算这两列之间的公共ID值的数量。下面是一个例子:R:比较大数据帧中的两个字符列

id.x     id.y 
1 123;145;156  143;156;234;165 
2 134;156;187;675 132;145;156;187 

所以在这种情况下,第一行具有1个共同的值,并且所述第二行具有两个共同的值。

表的大小是60M记录,有些字符串可能超过1000个长。我试图将数据写入文本文件,并通过python进行分析,但文件大小为30GB。任何想法在R中做到这一点? (正则表达式,应用,..)

我可以通过这个命令算上numbe 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(FUN=myfun, df[1:2,]$id.x, df[1:2,]$id.y) 
123;145;156 134;156;187;675 
      1    2 

那么,它为什么会打印第一列呢?我的命令有什么问题?

+3

的如果你不关心其他任何事情比你所看到的行,只读一次(或一次一个),并以这种方式处理。一个30GB的文件将需要60-90GB的内存,如果你想一次读完所有的内容...... – Justin

+0

那么,函数two是一次比较一行的呢?有四个循环? –

+2

我认为Python比R更有效,并建议你将它作为标签添加。 R中有策略用于从串行连接中进行分段读取,但它们相当笨拙。 –

回答

1

Mapply返回一个带有名称属性的整数向量。

y <- mapply(myfun, df$id.x, df$id.y) 
str(y) 
Named int [1:2] 1 2 
- attr(*, "names")= chr [1:2] "123;145;156" "134;156;187;675" 

与USE.NAMEs

mapply(myfun, df$id.x, df$id.y, USE.NAMES=FALSE) 
[1] 1 2 

放下它们,并使用一个索引和测试时间上越来越大的数据集

system.time(y <- mapply(myfun, df[1:1e5,]$id.x, df[1:1e5,]$id.y, USE.NAMES=FALSE))