【问题标题】:Subset data.table to represent the connections of objects子集 data.table 来表示对象的连接
【发布时间】:2020-05-10 15:25:13
【问题描述】:

Given 是一个表示 6 个对象之间关系的 data.table:

# create sampla data.table
x1 <- c(1,1,1,2,2,2,3,3,3,4,5,6)
x2 <- c(1,2,3,1,2,3,1,2,3,4,6,5)
dt <- data.table(x1, x2)

第一行代表对象。 第二行表示与其他对象的连接。

# check combinations
dt[dt$x1 != dt$x2]

对象 4 与其他对象没有任何联系。 对象 1、2 和 3 以及对象 5 和 6 是相连的。

现在,应该创建一个新列,其中所有连接的对象都获得相同的编号 (ID)

生成的 data.table 应如下所示:

x3 <- c(1,1,1,1,1,1,1,1,1,2,3,3)
dt.res <- data.table(dt, x3)

如何做到这一点?

【问题讨论】:

  • 可以在stackoverflow中搜索igraph集群
  • 可能是这篇文章的标题不太清楚或不适合这个问题。如果有人想编辑它,它可能更容易找到。

标签: r join merge data.table aggregate


【解决方案1】:
x1 <- c(1,1,1,2,2,2,3,3,3,4,5,6)
x2 <- c(1,2,3,1,2,3,1,2,3,4,6,5)
dt <- data.frame(x1, x2)

dt$x3=dt$x1
dt
for(i in 1:nrow(dt)){
  if(dt$x3[i]!=dt$x2[i]){
    dt$x3[dt$x3==dt$x2[i]]=dt$x3[i]
  }
}
setDT(dt)[, id := .GRP, by=x3]
dt
  1. 创建 x1、x3 的副本
  2. 遍历 x3,检查是否与 x2 不同
  3. 如果不同,则将 x3 中与您刚刚在 x2 中签入的元素相同的所有元素替换为 x3 的当前值
  4. 使用 setDT 函数分配 ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2014-05-23
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    相关资源
    最近更新 更多