微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

每次在 R 中更新图形时如何计算组件的数量

如何解决每次在 R 中更新图形时如何计算组件的数量

我有以下数据:

data <- data.frame(name = c("A","A","B","C","D","E","C"),surname = c("aa","bb","cc","dd","hh","ee","ii","aa","qq","ff","gg","cc"))

这个数据产生一个连通图:

plot(graph_from_data_frame(data,directed = F))

显然有 1 个组件。

每次我们在图表中添加一行时,我想计算此数据产生的组件数量。例如,初始图将有 1 个分量,因为数据第一行中的顶点 A 和 aa 是相连的。下一个图形将再次有 1 个组件,因为我们添加了第二行并且因为名称列中的 A 值。当我们包含第四行 (B,dd) 时,该图将有 2 个分量。

每次更新数据时,我使用以下代码获取组件数量

for (i in 1:dim(data)[1]) {
data$number_of_components[i] <- components(graph_from_data_frame(data[1:i,],directed = F))$no}

有没有更聪明/更复杂的方法来获得这个?谢谢。

解决方法

你可以看看sapply()

dt$number_of_components <- sapply(seq_len(nrow(dt)),function(x) {
  g <- graph_from_data_frame(dt[seq_len(x),],directed = FALSE)
  components(g)$no
})

dt

#    name surname number_of_components
# 1     A      aa                    1
# 2     A      bb                    1
# 3     A      cc                    1
# 4     B      dd                    2
# 5     B      hh                    2
# 6     C      ee                    3
# 7     D      ii                    4
# 8     D      aa                    3
# 9     D      qq                    3
# 10    D      ff                    3
# 11    E      gg                    4
# 12    B      ff                    3
# 13    C      gg                    2
# 14    C      cc                    1
,

您可以像下面这样尝试decompose

transform(
    data,num_components = sapply(
        seq_along(name),function(k) length(decompose(graph_from_data_frame(head(data,k),directed = FALSE)))
    )
)

transform(
    data,num_components = lengths(
        sapply(
            seq_along(name),function(k) decompose(graph_from_data_frame(head(data,directed = FALSE))
        )
    )
)

给出

   name surname num_components
1     A      aa              1
2     A      bb              1
3     A      cc              1
4     B      dd              2
5     B      hh              2
6     C      ee              3
7     D      ii              4
8     D      aa              3
9     D      qq              3
10    D      ff              3
11    E      gg              4
12    B      ff              3
13    C      gg              2
14    C      cc              1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。