Как загрузить фрейм данных в ndtv в R?

Моя цель - сделать динамическую визуализацию, используя три пакета в R: ndtv, network, а также networkDynamic пакеты.

Я создал набор данных с информацией, упорядоченной в соответствии с этим примером набора данных, в мастерской для сетевых динамических временных визуализаций (на странице 7).

Согласно странице 49 руководства по сетевой динамике, один из способов загрузить набор данных и преобразовать его в объект networkDynamic заключается в следующем:

rawEdges<-read.table(paste(path.package("networkDynamic"),"/enron_timebased3.tsv", sep=''),header=TRUE)

Тем не менее, когда я пытаюсь запустить animation.render(rawEdges)

R выдает сообщение об ошибке:

Первый аргумент должен быть сетевым объектом.

Чтобы это исправить, я создаю сетевой объект:net<-network(rawEdges)

и попробовать:

animation.render(net, rawEdges)

Новое сообщение об ошибке:

Ошибка в "$<-. Data.frame" (" tmp", "initial.coords", значение = c(0, 0, 0,: замена имеет 34 строки, данные имеет 26)

Кто-нибудь знает, как это исправить?

1 ответ

Подумайте, есть несколько проблем с вашим примером:

  • вам нужно будет создать networkDynamic объект, а не сетевой объект
  • вам нужно будет выполнить некоторое преобразование формата времени для правильного разбора таблицы, а также создать числовые идентификаторы
  • команда render.animation() не animation.render()

Во-первых, давайте настроим некоторые примеры данных, которые мы можем загрузить. Нужны только первые 4 столбца данных вашего примера:

# text version of the example data
text<-"onset    terminus    tail    head
9/6/2000    9/7/2000    mmmarcantel@equiva.com  matthew.lenhart@enron.com
9/6/2000    9/7/2000    stephen.harrington@enron.com    matthew.lenhart@enron.com
9/6/2000    9/7/2000    shelliott@dttus.com matthew.lenhart@enron.com
9/6/2000    9/7/2000    jilallen@dttus.com  matthew.lenhart@enron.com
5/7/2001    5/8/2001    ken.shulklapper@enron.com   matthew.lenhart@enron.com
9/6/2000    9/7/2000    eric.bass@enron.com matthew.lenhart@enron.com
9/6/2000    9/7/2000    shelliott@dttus.com matthew.lenhart@enron.com
9/6/2000    9/7/2000    bryan.hull@enron.com    matthew.lenhart@enron.com
9/6/2000    9/7/2000    jilallen@dttus.com  matthew.lenhart@enron.com
9/6/2000    9/7/2000    shelliott@dttus.com matthew.lenhart@enron.com
9/6/2000    9/7/2000    brook@pdq.net   matthew.lenhart@enron.com
9/5/2000    9/6/2000    tlenhart@corealty.com   matthew.lenhart@enron.com
9/5/2000    9/6/2000    patrick.ryder@enron.com matthew.lenhart@enron.com
9/5/2000    9/6/2000    eric.bass@enron.com matthew.lenhart@enron.com
9/5/2000    9/6/2000    mmmarcantel@equiva.com  matthew.lenhart@enron.com
5/7/2001    5/8/2001    tlenhart@corealty.com   matthew.lenhart@enron.com
9/5/2000    9/6/2000    tlenhart@corealty.com   matthew.lenhart@enron.com
9/5/2000    9/6/2000    tlenhart@corealty.com   matthew.lenhart@enron.com
9/5/2000    9/6/2000    paul.lucci@enron.com    matthew.lenhart@enron.com
9/5/2000    9/6/2000    jilallen@dttus.com  matthew.lenhart@enron.com
9/5/2000    9/6/2000    tlenhart@corealty.com   matthew.lenhart@enron.com
9/5/2000    9/6/2000    paul.lucci@enron.com    matthew.lenhart@enron.com
9/5/2000    9/6/2000    bryan.hull@enron.com    matthew.lenhart@enron.com
9/5/2000    9/6/2000    shelliott@dttus.com matthew.lenhart@enron.com
8/31/2000   9/1/2000    bryan.hull@enron.com    matthew.lenhart@enron.com
8/31/2000   9/1/2000    tlenhart@corealty.com   matthew.lenhart@enron.com"

# write out the example data to an example input file
inputFile<-tempfile()
cat(text,file=inputFile)

Теперь загрузите сетевую динамическую библиотеку

library(networkDynamic)

# read in tab-delimited example input file
timeData<-read.csv(inputFile,sep = "\t",stringsAsFactors = FALSE)
# check that it was loaded correctly
timeData

# convert the date formats into a numeric time (milliseconds)
timeData$onset<-as.numeric(as.POSIXct(timeData$onset,format='%m/%d/%Y'))
timeData$terminus<-as.numeric(as.POSIXct(timeData$terminus,format='%m/%d/%Y'))

# create a table of email address to map to numeric ids
emails<-unique(c(timeData$head,timeData$tail))

#covert ids
timeData$head<- match(timeData$head,emails)
timeData$tail<- match(timeData$tail,emails)

# convert to networkDynamic object
enronDyn<-networkDynamic(edge.spells=timeData)

# copy in the network names
network.vertex.names(enronDyn)<-emails

# load ndtv library
library(ndtv)

# compute the animation at 30-day interval
compute.animation(enronDyn,slice.par=list(start=967705200,end=989305200,interval=2592000,aggregate.dur=2592000,rule='latest'))
# render out the animation
render.animation(enronDyn)
ani.replay()

Тем не менее, ваши входные данные выглядят немного смешно для меня. Я почти уверен, что исходные данные электронной почты Enron имеют более точные временные метки, чем день, когда было отправлено электронное письмо, и для отправки каждого электронного письма не потребуется целый день? Если вы сможете найти версию данных с более точной временной меткой, у вас будет гораздо больше гибкости при отображении и анализе динамических событий. Например, вы будете знать порядок отправки электронных писем каждый день и т. Д.

Другие вопросы по тегам