0

所以,我有一个非常大的数据框,它有两列字符。这些字符是一些用“;”分隔的 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 中做到这一点?(正则表达式,应用,..)

我可以通过以下命令计算 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 一起使用时,它会打印所有列,但我只想要输出中的数字:

> mapply(FUN=myfun, df[1:2,]$id.x, df[1:2,]$id.y)
123;145;156 134;156;187;675 
          1               2

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

4

1 回答 1

1

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

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))
于 2013-10-18T20:58:46.703 回答