Diese Analyse folgt dem allgemeinen Split-Apply-Combine-Ansatz, bei dem die Daten nach Woche geteilt, Graphfunktionen angewendet und anschließend die Ergebnisse kombiniert werden. Dafür gibt es mehrere Tools, aber unten verwendet Base R und data.table
.
Base-R
erster Satz Daten-Klasse für Ihre Daten, so dass Begriff der letzten zwei Wochen Bedeutung hat.
# Set date class and order
d$week <- as.Date(d$week, format="%m/%d/%Y")
d <- d[order(d$week), ]
d <- d[d$timestalked > 0, ] # remove edges // dont need to do this is using weights
Dann Split und Grafik anwenden Funktionen
# split data and form graph for eack week
g1 <- lapply(split(seq(nrow(d)), d$week), function(i)
graph_from_data_frame(d[i,]))
# you can then run graph functions to extract specific measures
(grps <- sapply(g1, function(x) eigen_centrality(x,
weights = E(x)$timestalked)$vector))
# 2010-01-01 2010-01-08 2010-01-15
# A 0.5547002 0.9284767 1.0000000
# B 0.8320503 0.3713907 0.7071068
# C 1.0000000 1.0000000 0.7071068
# Aside: If you only have one function to run on the graphs,
# you could do this in one step
#
# sapply(split(seq(nrow(d)), d$week), function(i) {
# x = graph_from_data_frame(d[i,])
# eigen_centrality(x, weights = E(x)$timestalked)$vector
# })
Sie dann in der Analyse auf alle Daten kombinieren müssen - wie Sie nur zwei weitere Diagramme bauen müssen, ist dies nicht der zeit- Teil verbrauchen.
fun1 <- function(i, name) {
x = graph_from_data_frame(i)
d = data.frame(eigen_centrality(x, weights = E(x)$timestalked)$vector)
setNames(d, name)
}
a = fun1(d, "alldata")
lt = fun1(d[d$week %in% tail(unique(d$week), 2), ], "lasttwo")
# Combine: could use `cbind` in this example, but perhaps `merge` is
# safer if there are different levels between dates
data.frame(grps, lt, a) # or
Reduce(merge, lapply(list(grps, a, lt), function(x) data.frame(x, nms = row.names(x))))
# nms X2010.01.01 X2010.01.08 X2010.01.15 alldata lasttwo
# 1 A 0.5547002 0.9284767 1.0000000 0.909899 1.0
# 2 B 0.8320503 0.3713907 0.7071068 0.607475 0.5
# 3 C 1.0000000 1.0000000 0.7071068 1.000000 1.0
data.table
Es ist wahrscheinlich, dass der zeitaufwendige Schritt ausdrücklich geteilt ausübe wird die Funktion über die Daten. data.table
sollte hier einige Vorteile bieten, besonders wenn die Daten groß werden und/oder es mehr Gruppen gibt.
# function to apply to graph
fun <- function(d) {
x = graph_from_data_frame(d)
e = eigen_centrality(x, weights = E(x)$timestalked)$vector
list(e, names(e))
}
library(data.table)
dcast(
setDT(d)[, fun(.SD), by=week], # apply function - returns data in long format
V2 ~ week, value.var = "V1") # convert to wide format
# V2 2010-01-01 2010-01-08 2010-01-15
# 1: A 0.5547002 0.9284767 1.0000000
# 2: B 0.8320503 0.3713907 0.7071068
# 3: C 1.0000000 1.0000000 0.7071068
Dann führen Sie einfach die Funktion über die gesamten Daten/letzten zwei Wochen wie zuvor.
Es gibt Unterschiede zwischen den Antworten, die darauf zurückzuführen sind, wie wir das Argument weights
bei der Berechnung der Zentralität verwenden, während die anderen die Gewichte nicht verwenden.
d=structure(list(from = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L,
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("A",
"B", "C"), class = "factor"), to = structure(c(2L, 3L, 2L, 3L,
2L, 3L, 1L, 3L, 1L, 3L, 1L, 3L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("A",
"B", "C"), class = "factor"), timestalked = c(0L, 1L, 0L, 4L,
1L, 2L, 0L, 1L, 0L, 2L, 1L, 0L, 1L, 2L, 1L, 0L, 0L, 0L), week = structure(c(1L,
1L, 3L, 3L, 2L, 2L, 1L, 1L, 3L, 3L, 2L, 2L, 1L, 1L, 3L, 3L, 2L,
2L), .Label = c("1/1/2010", "1/15/2010", "1/8/2010"), class = "factor")), .Names = c("from",
"to", "timestalked", "week"), class = "data.frame", row.names = c(NA,
-18L))
Beitrag, was Sie bisher versucht, das nicht funktioniert hat, und kopieren und die Ausgabe von 'dput (my_data) fügen Sie' statt, wie Sie es jetzt formatiert haben. – useR
@useR Ich habe Tage damit verbracht, im Web zu suchen und Tutorials zu betrachten, ohne Glück. Ich griff auf die csv-Intro manuell Hunderte von Subdateien mit C++ brechen. Ich habe dann die benötigte Analyse durchgeführt. Es ist also alles getan, aber für den Abschluss denke ich, dass dies ein wichtiges Thema ist, auf das man sich konzentrieren muss. Ich verstehe, wenn niemand in der Gemeinde weiß, wie es geht. – CJ12
Ich glaube nicht, dass diese Frage zu schwierig ist. Ich bin sicher, dass jemand es lösen kann. So haben Sie Ihre Daten formatiert, die es den Leuten schwer machen zu arbeiten (lesen Sie hierzu https://stackoverflow.com/a/5963610/5150629). Wenn Sie hilfreiche Antworten erhalten möchten, veröffentlichen Sie zumindest die Daten, mit denen die Leute arbeiten können, indem Sie die Ausgabe von 'dput (my_data)' kopieren und einfügen, und geben Sie an, wie die endgültige Ausgabe aussehen soll. – useR