2014-08-31 3 views
1

Паспорт выглядит следующим образомСреднее значение подграфа в г

library(igraph) 
From <- c(1,2,3,4,5,6,7,8) 
To <- c(NA,1,2,3,2,NA,6,7) 
Value<- c(1,0,0.5,0.5,0,-1,-1,-0.5) 
Data <- data.frame(From,To, Value) 
Network <- graph.data.frame(Data[,c("From","To")]) 
Network<- Network - "NA" 
plot(Network) 

Теперь я хотел бы знать AverageValue о суграфе они находятся и на этом начальный Dataframe. В конце концов, это должно выглядеть следующим образом:

From <- c(1,2,3,4,5,6,7,8) 
To <- c(NA,1,2,3,2,NA,6,7) 
Value<- c(1,0,0.5,0.5,0,-1,-1,-0.5) 
AverageTreeValue<- c(0.4,0.4,0.4,0.4,0.4,-0.833,-0.833,-0.833) 
FinalData <- data.frame(From,To, Value, AverageTreeValue) 

ответ

3

Вы можете использовать функцию clusters для вычисления компонент связности в вашем графике, aggregate вычислить среднее значение для каждого из этих групп, и merge объединить два вместе :

Data$group <- clusters(Network)$membership 
(FinalData <- merge(Data, aggregate(Value~group, Data, mean), by="group")) 
# group From To Value.x Value.y 
# 1  1 1 NA  1.0 0.4000000 
# 2  1 2 1  0.0 0.4000000 
# 3  1 3 2  0.5 0.4000000 
# 4  1 4 3  0.5 0.4000000 
# 5  1 5 2  0.0 0.4000000 
# 6  2 6 NA -1.0 -0.8333333 
# 7  2 7 6 -1.0 -0.8333333 
# 8  2 8 7 -0.5 -0.8333333 

в качестве альтернативы, вы можете использовать match для выполнения слияния и получить больше контроля над именами генерируемого столбца:

groups <- clusters(Network)$membership 
means <- aggregate(Value~group, data.frame(Value=Data$Value, group=groups), mean) 
Data$AverageTreeValue <- means$Value[match(groups, means$group)] 
Data 
# From To Value AverageTreeValue 
# 1 1 NA 1.0  0.4000000 
# 2 2 1 0.0  0.4000000 
# 3 3 2 0.5  0.4000000 
# 4 4 3 0.5  0.4000000 
# 5 5 2 0.0  0.4000000 
# 6 6 NA -1.0  -0.8333333 
# 7 7 6 -1.0  -0.8333333 
# 8 8 7 -0.5  -0.8333333 
Смежные вопросы