如何使用igraph通过合并两个变量的公共值来重塑数据?

col17t5w  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(165)

示例数据集如下:
| var1| var2| var3|
| --|--|--|
| 一| 1 | 2 |
| B| 2 | 3 |
如果var 1 = a的var 2 = var 1 = B的var 3,我想将var 1 = a的记录链接到var 1 = B。
因此,示例数据集将变成这样:
| var1| var2| var3|
| --|--|--|
| 一| 1 | 3 |
另外,如果var 1 = b之后的下一行也是b,那么记录也将被链接,例如:
| var1| var2| var3|
| --|--|--|
| 一| 1 | 2 |
| B| 2 | 3 |
| B| 3 | 5 |
| B| 7 | 9 |
| C| 5 | 9 |
我想要的结果:
| var1| var2| var3|
| --|--|--|
| 一| 1 | 5 |
| B| 7 | 9 |
| C| 5 | 9 |
有什么方法可以做到这一点吗?谢谢你,谢谢!
根据zx 8754的评论,可以使用igraph来为这个问题进行数据清理。然而,当我试图使用

library(igraph)

df = structure(list(var1 = c("a", "b", "b", "b", "c"), var2 = c(1L,
                                                           2L, 3L, 7L, 5L), var3 = c(2L, 3L, 5L, 9L, 9L)), class = "data.frame", row.names = c(NA,
                                                                                                                                               -5L))

g <- graph_from_data_frame(df)

图中只显示了var2,忽略了var3

问题
1.如果ab的名称不相同,如何连接它们?
1.如何在图中添加一个变量(var 3)?

qij5mzcb

qij5mzcb1#

df %>%
   group_by(grp = cumsum(var2 != lag(var3, default = FALSE))) %>%
   summarise(var1 = first(var1), var2 = first(var2), var3=last(var3))

# A tibble: 3 × 4
    grp var1   var2  var3
  <int> <chr> <int> <int>
1     1 a         1     5
2     2 b         7     9
3     3 c         5     9
qacovj5a

qacovj5a2#

首先:我对使用igraph解决您的问题的可行性持怀疑态度,因为您希望从上到下顺序地分离和分组行,而igraph则从您的框架中读取所有边缘信息,而不管行的顺序如何。

这并不意味着不可能使用igraph*,但您可能需要大量额外的努力来保留顺序特性,例如,迭代地添加边并检查它们是否可以链接。我不认为这是值得与这么多的努力,因为它的效率低下,也计算繁重。

创意

我猜你是在以 * 连续 * 的方式将节点(用var2var3表示)从顶到底进行分组。如果这个过程被一行打断,比如从第三行到第四行,那么你需要从一个新的组开始。

代码

这是一个老式的基础R选项

f <- function(df) {
    res <- c()
    repeat {
        if (nrow(df) <= 1) {
            return(rbind(res, df))
        } else {
            for (k in 2:nrow(df)) {
                if (df$var2[k] == df$var3[k - 1]) {
                    df[k, c("var1", "var2")] <- df[k - 1, c("var1", "var2")]                } else {
                    res <- rbind(res, df[k - 1, ])
                    df <- tail(df, -(k - 1))
                    break
                }
            }
        }
    }
}

你将获得

> f(df)
  var1 var2 var3
3    a    1    5
4    b    7    9
5    c    5    9

数据

> dput(df)
structure(list(var1 = c("a", "b", "b", "b", "c"), var2 = c(1L,
2L, 3L, 7L, 5L), var3 = c(2L, 3L, 5L, 9L, 9L)), class = "data.frame", row.names = c(NA,
-5L))

> df
  var1 var2 var3
1    a    1    2
2    b    2    3
3    b    3    5
4    b    7    9
5    c    5    9

相关问题