所以,我有一个非常庞大的数据框,它有两列字符。字符是由";"分隔的一些ID值。所以,我想计算这两列之间的公共ID值的数量。这是一个例子:
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? (正则表达式,申请,......)
我可以通过此命令计算常见值的数量:
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
那么,为什么还要打印第一列呢?我的命令出了什么问题?
答案 0 :(得分: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))