问题描述
我有以下数据:
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