【问题标题】:R group pairs of rows in a dataframe based on true/false functionR根据真/假函数对数据框中的行进行分组
【发布时间】:2015-02-24 16:41:12
【问题描述】:

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

在如下示例数据集中:

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

                         ...

该函数通过对 (function(row1,row2)) 检查行字段之间的某些规则,如果这些行应该在一起,则返回 TRUE / FALSE。 p>

我需要将该函数应用于数据框中的所有可能对,并生成一个列表(或其他结构),其中所有 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

【问题讨论】:

  • 不清楚您是否只想将所有TRUEs 和所有FALSEs 聚合在一起,或者您只想将连续的TRUEs 和FALSE 聚合在一起。例如,如果您得到T, T, T, F, F, T,T,那么输出将是1,2,3,然后是4,5,然后是6,7?还是您只是 1,2,3,6,74,5?或者也许是第三种选择?
  • 用另一个例子改变了例子。这是否更好地解释了我试图完成的事情?

标签: r


【解决方案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

【讨论】:

  • 您将如何以有效的方式从初始数据集创建矩阵?
  • this question 接受的答案讨论了一个类似的问题(答案仅限于上三角形),并且相当彻底。
猜你喜欢
  • 2020-12-26
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多