2013-11-01 2 views
-1

Я как бы новичок во всем здесь. Я попытался приложить больше усилий, чтобы сделать мой код доступным для чтения. Я пишу код для запуска функции для нескольких файлов. У меня есть более 100 файлов, и каждый файл содержит edgelist времени (сессии) следующим образом:Как построить сеть путем подмножества на основе периода времени

Header: Time Sender Receiver 

     1 1  2 
     1 1  3 
     2 2  1 
     2 2  1 
     3 1  2 
     3 1  2 

Целью функции является извлечение подсетей из каждого файла на основе «Time». Поскольку существует 3 разных периода времени, каждый файл будет иметь 3 подсетей. Ниже приведен код, который я написал:

SubsetNetwork <-function (file) { 
    df = read.csv(file) 
    uniq <-unique(unlist(df$Time)) 
    edgelist=list() 
    g=list() 
    for (i in 1:length(uniq)){ 
    g <- lapply(split(df, df$Time), function(x) { 
     graph.edgelist(as.matrix(x[c("Sender","Receiver")]), directed = T) 
    }) 
    edgelist[[i]]=get.edgelist(g[[i]]) 

    filename=paste(fname, i, ".csv") 
    write.csv(edgelist[[i]], filename) 
    } 
} 

Этот код будет выполнять вышеуказанную функцию.

temp = list.files(pattern="*.csv") 
for (i in 1:length(temp)){  
    file <-temp[i]    
    SubsetNetwork (file) 
}  
  • входного файла = 626234T.csv
  • Выходные файлы = 626234T1.csv, 626234T2.csv, 626234T3.csv.

Я продолжал получать ошибку (Error in g[[i]] : subscript out of bounds). Если бы я запускал код один за другим, он казался рабочим. Однако, если я подал несколько файлов, он сгенерировал выходы для нескольких файлов и прекратил работу. Я не мог понять, что вызвало проблему.

+0

Пожалуйста, прилагать больше усилий, чтобы сделать код для чтения (и воспроизводимым). Просто публикация скриншота без вызова библиотеки для не-базовых функций не является достаточным усилием. Вы также должны вывести вывод из 'dput (head (df))'. –

+0

Я не уверен, что понимаю, что вы делаете, но это помогает: 'lapply (split (df, df $ Time), function (x) graph.edgelist (as.matrix (x [c (" Sender " , «Receiver»)]), direct = T)) '? ('df' - это датаграмма в конце (Time Sender и т. д.)). Вывод представляет собой список из 3 элементов типа IGRAPH D --- 3 2 -. –

+0

жаль, что мой код не был доступен для чтения. Я не привык писать код. Я стараюсь учиться сам. @alexis_laz Спасибо. Думаю, ваш код поможет много. – user1710819

ответ

0

Если ваш код работает нормально для одного файла, ошибка, которую вы получаете, указывает на то, что это не проблема с вашим кодом. Вы должны получать только g[[i]] находится вне границ, если количество уникальных моментов времени < 1.

Я подозреваю, что то, что происходит, есть уродливый или поврежден файл отсутствует «время» заголовок, который в настоящее время подхвачен temp <- list.files(*.csv).

Поскольку вы не привыкли писать код, я пройду, критический анализ и исправить некоторые вещи для вас:

SubsetNetwork <-function (file) { 
    df = read.csv(file) 
    uniq <-unique(unlist(df$Time)) 

Колонны data.frames только векторы, так что вам не нужно unlist Вот. Вместо этого:

uniq <-unique(df$Time) 

Достаточно.

edgelist=list() 
    g=list() 
    for (i in 1:length(uniq)){ 
    g <- lapply(split(df, df$Time), function(x) { 
     graph.edgelist(as.matrix(x[c("Sender","Receiver")]), directed = T) 
    }) 
    edgelist[[i]]=get.edgelist(g[[i]]) 

    filename=paste(fname, i, ".csv") 
    write.csv(edgelist[[i]], filename) 
    } 
} 

Возможно, вам не нужна петля for. lapply кадра данных split вернет весь список, поэтому его можно перемещать за пределы цикла. Если get.edgelist векторизован, это также можно перемещать за пределы цикла. Так как я на самом деле не знаю, я буду считать, что это не просто, чтобы быть безопасным:

g <- lapply(split(df, df$Time), function(x) { 
    graph.edgelist(as.matrix(x[c("Sender","Receiver")]), directed = T) 
    }) 
    edgelist <- lapply(g, get.edgelist) 

    for (i in 1:length(uniq)){ 
    filename=paste(fname, i, ".csv") 
    write.csv(edgelist[[i]], filename) 
    } 
} 

Теперь, вы также не нужно uniq, так как количество unique временных точек просто длина обоих g и ваш edgelist.

Когда filename=paste(fname, i, ".csv") функция paste будет вставлять пробелы между аргументом (т.е. fname 1 .csv вместо fname1.csv. Вы можете либо указать sep="" изменить поведение paste или использовать paste0 как стенография.

Доведение что все вместе:

SubsetNetwork <-function (file) { 
    df = read.csv(file) 
    g <- lapply(split(df, df$Time), function(x) { 
    graph.edgelist(as.matrix(x[c("Sender","Receiver")]), directed = T) 
    }) 
    edgelist <- lapply(g, get.edgelist) 

    for (i in 1:length(g)){ 
    filename=paste0(fname, i, ".csv") 
    write.csv(edgelist[[i]], filename) 
    } 
} 
+0

Большое вам спасибо за ваши комментарии. Поскольку я пытаюсь изучить R самостоятельно, я использовал коды из чужих (даже я не был уверен, что они на самом деле сделали). В любом случае, благодаря вам, я многому научился. – user1710819

+0

Добро пожаловать! Я заметил много предварительных концепций для кого-то, кто просто учился, поэтому я подумал, что помогу немного :) –