Сохранить графики и статистику из вложенных циклов - PullRequest
0 голосов
/ 01 октября 2018

Я сталкивался с вопросом о сохранении графиков и статистики из вложенных циклов в R. То, что у меня есть, это несбалансированные данные панели социальных сетей.В приведенном ниже примере он имеет сетевое соединение в 3 местах с 2001 по 2003 год. Я стремился генерировать сетевые графики вместе с некоторой статистикой за каждый год для каждого местоположения (поэтому девять графиков и девять статистических данных SNA из примера).Но я запутался в настройке контейнера результатов заранее, особенно когда цикл вложен.Я был бы очень признателен, если бы кто-нибудь мог помочь с этим.

> # import file 
> el <- read.csv(file.choose(), header = TRUE )  
> print(el)                                   # example data
   bname sname year loc
1      a     b 2001   1
2      a     c 2001   1
3      a     b 2002   1
4      b     c 2002   1
5      b     e 2002   1
6      e     a 2003   1
7      b     a 2003   1
8      a     c 2003   1
9      b     e 2001   2
10     a     c 2002   2
11     a     b 2002   2
12     b     c 2002   2
13     c     e 2002   2
14     c     e 2003   2
15     b     e 2003   2
16     a     b 2003   2
17     a     b 2001   3
18     a     c 2001   3
19     a     e 2001   3
20     a     d 2001   3
21     a     b 2002   3
22     b     c 2002   3
23     b     c 2003   3
> # Import objects
> loc <- as.vector(unique(el$loc))
> year <- as.vector(unique(el$year))
> start <- 2001
> end <- 2003

> # Result container
> mylist <- vector('list', length(loc))       # final list
> acc <- paste("")                            # vector for avg. cluster coef.
> sna <- cbind(year, acc)                     # matrix for each location

> # Loop, i for location, acc. as example
> for (i in unique(loc)) {
+   
+   for (j in start:end) {
+     el_s <- subset(el, loc==i & year==j)    # pick subsample                  
+     edge <- el[order(el_s$bname, el_s$sname),]
+     nw <- graph_from_data_frame(d= el_s, directed = T)
+     
+     # graph plotting 
+     png("network"i""j".jpg")                        
 Error: unexpected symbol in:
 "    # graph plotting 
    png("network"i"                           # Error here -- Can the name be save in "network_i_j" mode?
>     plot(nw)
>     dev.off()
null device 
          1 
+     
+     # SNA statistics
+     sna[j,"acc"] <- transitivity(nw, type = "average") # Error here
+     
+   }  
+   
+   mylist[[i]] <- sna
+ }
Error in `[<-`(`*tmp*`, j, "acc", value = transitivity(nw, type = "average")) : 
  subscript out of bounds

Я пытался применить методы из предыдущего поста для двойных циклов, и я думаю, что я запутался в терминахсохранения результатов во внутреннем цикле.Кроме того, при сохранении графика я не знаю, может ли R сохранить имя в режиме «network_location_year»?Я сделал это так, как это сделал Стата, поэтому, наверное, это не относится к R.

Еще раз спасибо за продвинутый !!

1 Ответ

0 голосов
/ 01 октября 2018

это проблема с форматированием имен файлов.При открытии устройства png вы должны использовать

png(sprintf("network_%s_%s.png", i, j))

.

И для этой строки,

sna[j,"acc"] <- transitivity(nw, type = "average")

вы получаете индекс вне границ, потому что j находится между2001 и 2003, а не с 1 по 3. Вместо этого вам понадобится

sna[sna$year == j,"acc"] <- transitivity(nw, type = "average")

.

Кстати, если вам нужен jpg, а не png, вы можете использовать

jpeg(sprintf("network_%s_%s.jpg", i, j))
...