2012-10-23 39 views
2

概述将集合转换为R中列索引的有效方法是什么?

给一个大的(NROWS> 5,000,000+)数据帧,,与串行名称和不相交的集合的列表(N = 20,000),,其中每个组由行名称A,通过唯一值创建代表集合的向量的最佳方法是什么?B

插图

下面是说明该问题的一个示例:

# Input 
A <- data.frame(d = rep("A", 5e6), row.names = as.character(sample(1:5e6))) 
B <- list(c("4655297", "3177816", "3328423"), c("2911946", "2829484"), ...) # Size 20,000+ 

期望的结果将是:

# An index of NA represents that the row is not part of any set in B. 
> A[,"index", drop = F] 
     d index 
4655297 A  1 
3328423 A  1 
2911946 A  2 
2829484 A  2 
3871770 A NA 
2702914 A NA 
2581677 A NA 
4106410 A NA 
3755846 A NA 
3177816 A  1 

朴素尝试

这样的事情可以用以下方法来实现。

n <- 0 
A$index <- NA 
lapply(B, function(x){ 
    n <<- n + 1 
    A[x, "index"] <<- n 
}) 

问题

然而,这是不合理的慢(几个小时)由于多次索引和不是很R-式的或典雅。

如何快速高效地生成期望的结果?

回答

4

这是一个建议,使用基地与当前的方法相比不算太差。

的样本数据:

A <- data.frame(d = rep("A", 5e6), 
       set = sample(c(NA, 1:20000), 5e6, replace = TRUE), 
       row.names = as.character(sample(1:5e6))) 
B <- split(rownames(A), A$set) 

基本方法:

system.time({ 
A$index <- NA 
A[unlist(B), "index"] <- rep(seq_along(B), times = lapply(B, length)) 
}) 
# user system elapsed 
# 15.30 0.19 15.50 

检查:

identical(A$set, A$index) 
# TRUE 

对于任何事物都快,我想data.table会来得心应手。

+0

谢谢。优雅而快捷! – Nixuz

相关问题