Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的递归分组_R_Dplyr - Fatal编程技术网

R中的递归分组

R中的递归分组,r,dplyr,R,Dplyr,我试图找到一种基于“重叠”变量创建顺序组ID的方法。对我来说,描述这一点最简单的方法是使用房屋、贷款和借款人的例子 假设我们有下面的例子 df <- data.frame(house = c('H_01','H_02','H_03','H_04','H_05'), loan = c('L_01','L_02','L_02','L_03','L_04'), borrower = c('B_01','B_0

我试图找到一种基于“重叠”变量创建顺序组ID的方法。对我来说,描述这一点最简单的方法是使用房屋、贷款和借款人的例子

假设我们有下面的例子

df <- data.frame(house     = c('H_01','H_02','H_03','H_04','H_05'),
                 loan      = c('L_01','L_02','L_02','L_03','L_04'),
                 borrower  = c('B_01','B_01','B_02','B_03','B_04'))

dfA.韦伯的解决方案显然是优越的。但既然我找到了解决办法,我就把它放在这里

df = data.frame(apply(df, 2, as.character), stringsAsFactors = FALSE)
g = 1
df$group[1] = paste("G",g,sep = "")

#Find out unique groups and assign "CHECK" to rows in same groups
for (i in 2:nrow(df)){
    if (any(df[i,1:3] %in% unlist(df[1:(i-1),1:3]))){
        df$group[i] = "CHECK"
    } else {
        g = g + 1
        df$group[i] = paste("G",g,sep = "")
    }   
}

#Assign groups to rows in same group
for (i in 1:nrow(df)){
    if (df$group[i] != "CHECK"){
        next
    }
    if (df$house[i] %in% df$house[1:i]){
        df$group[i] = df$group[match(df$house[i], df$house[1:i])]        
    }
    if (df$loan[i] %in% df$loan[1:i]){
        df$group[i] = df$group[match(df$loan[i], df$loan[1:i])]        
    }
    if (df$borrower[i] %in% df$borrower[1:i]){
        df$group[i] = df$group[match(df$borrower[i], df$borrower[1:i])]       
    }
}

#> df$group
#[1] "G1" "G1" "G1" "G2" "G3"
您正在寻找“连接的组件”。我们可以通过首先重新排列数据(
melt
),然后请求一个实现良好的图形库(
igraph
)来将这些关系视为一个图形

library(reshape2)
library(igraph)

components(graph.data.frame(melt(df,id="house")[,c(1,3)]))$membership[df$house]

  # H_01 H_02 H_03 H_04 H_05 
  #  1    1    1    2    3 
一般来说,您可能希望将与值的关系粘贴在一起,以“着色”节点,例如

with(melt(df,id="house"),data.frame(x=house,y=paste(variable,value,sep=".")))

在创建图表之前。

不是我的专长,但听起来像网络/igraph。对于这个简单的例子,基本R代码
cumsum(pmin(c(1,diff(df$loan)),c(1,diff(df$brooker)))
将计算组。但是,如果一个早期借款人有多笔贷款,并且与多个借款人分享这些贷款,有些提前,有些延迟,那么这通常不起作用。谢谢@A.Webb-这非常有效,也非常优雅。我一直在推迟对图形数据库的深入研究,但这只是一个令人信服的例子,说明了我一直错过的东西。作为一个额外的问题;从哪个变量开始锚定重要吗(在你的代码中,你从
房子开始
——但是如果我有n个变量,那么我选择哪一个会有区别吗?这不重要。这是一个有点捷径的原因。首先,默认的图形是定向的,这意味着我们指定了一条从H_01到L_01的边,而不是相反。我们可以/应该指定一条从H_01到L_01的边。)fy
directed=FALSE
,但是
组件默认情况下会检查弱连接,即好像有向边是无向的。第二,第一行中的关系实际上是H_01-L_01、H_01-B_01和L_01-B_01,但我们只将前两个作为边包含在内。这并不重要,因为关系是transitive和connectedness一样。同样感谢@d.b-一个经过深思熟虑的解决方案,尽管对于n个变量来说实现起来有点困难。感谢您的及时回复