R中的递归分组
我试图找到一种基于“重叠”变量创建顺序组ID的方法。对我来说,描述这一点最简单的方法是使用房屋、贷款和借款人的例子 假设我们有下面的例子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
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的边。)fydirected=FALSE
,但是组件默认情况下会检查弱连接,即好像有向边是无向的。第二,第一行中的关系实际上是H_01-L_01、H_01-B_01和L_01-B_01,但我们只将前两个作为边包含在内。这并不重要,因为关系是transitive和connectedness一样。同样感谢@d.b-一个经过深思熟虑的解决方案,尽管对于n个变量来说实现起来有点困难。感谢您的及时回复