2015-02-24 72 views
2

我需要使用自定义函数作为分组条件从我的数据框创建行组。该函数将比较两对行,如果这些行应该组合在一起,则返回true/false。基于true/false函数的数据框中的R组行对

在一个实例中的数据集,如:

id field  code1 code2 
1 textField1 055 066 
2 textField2 100 120 
3 textField3 300 350 
4 textField4 800 450 
5 textField5 460 900 
6 textField6 490 700 

         ... 

的功能通过对检查行字段之间一定的规则(函数(ROW1,ROW2)),并返回TRUE/FALSE如果这些行应一起。

我需要将该函数应用于数据框中的所有posible对,并生成一个列表(或其他结构),其中所有ID都匹配在一起。该功能适用​​于每一对

一种方式显示在this answer

lapply(seq_len(nrow(df) - 1), 
     function(i){ 
     customFunction(df[i,], df[i+1,]) 
     }) 

但我不能想办法到组,进行了TRUE作为结果

编辑行:再阅读我的问题,似乎需要一个例子:

如果我们创建了一个包含所有可能组合的矩阵,结果将为:

 [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] TRUE FALSE FALSE FALSE FALSE FALSE 
[2,] FALSE TRUE TRUE TRUE FALSE FALSE 
[3,] FALSE TRUE TRUE FALSE FALSE FALSE 
[4,] FALSE TRUE FALSE TRUE FALSE FALSE 
[5,] FALSE FALSE FALSE FALSE TRUE TRUE 
[6,] FALSE FALSE FALSE FALSE TRUE TRUE 

,得到的组会,那么:

1 
2,3,4 
5,6 
+0

目前尚不清楚,如果你只是想聚合所有'TRUE's在一起和所有'FALSE'在一起,或者你只是想聚合连续的'TRUE'和'FALSE'。例如,如果你得到'T,T,T,F,F,T,T',那么输出将是'1,2,3',然后是'4,5',然后是'6,7'?或者你只是'1,2,3,6,7'和'4,5'?或者可能有第三种选择? – 2015-02-24 16:58:27

+1

将示例更改为另一个示例。这是一个更好的解释,我试图完成什么? – Rwak 2015-02-24 17:12:34

回答

1

这里是一个函数,它您指定的内容:

mx <- matrix(c(TRUE,FALSE,FALSE,FALSE,FALSE,FALSE, 
FALSE,TRUE,TRUE,TRUE,FALSE,FALSE, 
FALSE,TRUE,TRUE,FALSE,FALSE,FALSE, 
FALSE,TRUE,FALSE,TRUE,FALSE,FALSE, 
FALSE,FALSE,FALSE,FALSE,TRUE,TRUE, 
FALSE,FALSE,FALSE,FALSE,TRUE,TRUE),6) 


groupings <- function(mx){ 

    out <- list() 
    while(dim(mx)[1]){ 
     # get the groups that match the first column 
     g = which(mx[,1]) 

     # expand the selection to any columns for which 
     # there is match in the first row 
     (expansion = which(apply(cbind(mx[,g]),1,any))) 
     while(length(expansion) > length(g)){ 
      g = expansion 

      # expand the selection to any columns for which 
      # there is match to the current group 
      expansion = which(apply(cbind(mx[,g]),1,any)) 
     } 

     out <- c(out,list(g)) 
     mx <- mx[-g,-g] 
    } 
    return(out) 

} 

groupings(mx) 
#> [[1]] 
#> [1] 1 
#> 
#> [[2]] 
#> [1] 1 2 3 
#> 
#> [[3]] 
#> [1] 1 2 
+0

如何以有效的方式从初始数据集创建矩阵? – Rwak 2015-02-25 08:56:51

+0

[此问题]的接受答案(http://stackoverflow.com/questions/28653691/double-for-loop-to-calculate-averages-and-store-them-in-matrix/28653854)讨论了类似的问题(答案限于上三角形),并且非常全面。 – Jthorpe 2015-02-25 15:53:47

相关问题