2017-06-27 29 views
0

Ich muss eine Reihe Zentralitätswerte für Benutzer in einem Netzwerk über verschiedene Jahre hinweg plotten.Plotten nur bestimmte Elemente in einer Liste in R

Ich bin nur daran interessiert, einige zu plotten, aber ich kann nicht herausfinden, wie es geht und nicht alle Benutzer erscheinen jedes Jahr.

Hier ist ein Beispiel für die Daten. Ich möchte zum Beispiel Werte für "jhpedraza" plotten können, oder noch besser, eine Zeichenfolge wie users=c("jhpedraza","other user"). Versuchen Sie auch "char_arturo", um alle möglichen Fehler zu reproduzieren.

l=structure(list(`2009` = NULL, `2010` = NULL, `2011` = structure(c(0.0112191199212738, 
0.0119663133080306, 0.0112191199212738), .Names = c("jhpedraza", "didactech", 
"juanmanuelcorzo")), `2012` = structure(c(0.00520863174452703, 0.00543486753203931), 
.Names = c("jhpedraza", "lasillaenvivo")), `2013` = structure(c(0.00457122723603219, 
0.00362782800771276, 0.00342927774646075), .Names = c("jhpedraza", "milobeta", 
"char_arturo"))), split_type = "data.frame", split_labels = structure(list 
(`format(Date, "%Y")` = c("2009", "2010", "2011", "2012", "2013")), .Names = 
"format(Date, \"%Y\")", class = "data.frame", row.names = c(NA, -8L)), .Names = 
c("2009", "2010", "2011", "2012", "2013")) 

Hier ist ein Beispiel für die Handlung ich bin nach. Ich schaffte es nach vieler Datenmanipulation zu tun, aber ich bin es gibt eine bessere Lösung überzeugt: enter image description here

+0

'sapply (l, i = 1, Funktion (x, i) x [i])' vielleicht würde dies funktionieren. Dies gibt jede erste Spalte jedes Datenrahmens zurück. Sie können i im Sapply ändern, um verschiedene Spalten zu erhalten. Inzwischen ist dies ein [XY-Problem] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Posten Sie was Sie plotten möchten und Sie werden wahrscheinlich eine Antwort viel einfacher als das bekommen. – Masoud

+0

danke, Ihr Code Adressierung Name statt Nummer funktioniert gut: sapply (l, i = "jhpedraza", Funktion (x, i) x [i]) – supercontra

Antwort

0

Dies ist die Lösung, für die ich mich entschieden habe, Code aus einer anderen SO-Frage in Listen verwenden:

ttt <- do.call(rbind, lapply(l, data.frame, stringsAsFactors=FALSE)) 

ttt$an <- rownames(ttt) 

text <- as.character(ttt$an) 

p2=as.data.frame(text) %>% separate(text, into = c("Year","User")) 

ttt <- cbind(p2,ttt) 

names(ttt) <- c("Year","User","PageRank","id") 

ids <- c("jhpedraza","lasillaenvivo") 

qqq <- subset(ttt,User %in% ids) 


ggplot(qqq, aes(y = log(PageRank), x = Year, colour = as.factor(User))) + 
     geom_point() + 
     geom_smooth(aes(group = as.factor(User)),se=FALSE)+ggtitle("Centrality by Year") + labs(x="Year", y="Page Rank (log)") + labs(color='User') 

enter image description here

+0

Froh, dass Sie Ihre Antwort gefunden haben. Ich hatte noch keine Zeit, auf Ihre E-Mail zu antworten. Prost. – Masoud

0

Vielleicht wäre es einfacher, wenn Sie tust dies mit tidyr und dplyr:

a <- 1; b <- 2; c <- 3 

p2001 <- data.frame(a,b,c, yr = 2001) 

a <- 2; b <- 1; c <- 3; e <- 3 

p2002 <- data.frame(a,b,c,e, yr = 2002) 

a <- 2; c <- 3; e <- 3; f <- 4 

p2003 <- data.frame(a,c,e,f, yr = 2003) 

library(tidyr) 
library(dplyr) 
p.years <- bind_rows(p2001,p2002,p2003) 

p.years.gathered <- gather(p.years,key = USER,value = VALUE,c(1,2,3,5,6)) 

Jetzt Sie kann von allen Benutzern geplottet werden, oder den Dataframe nur in die Benutzer unterteilen, die Sie interessieren. Sie müssen nur nachsehen, welche Spalte das Jahr nach den Bind_Rows hat, und die Sammlung entsprechend anpassen.

+0

Ich denke, die Änderungen erheblich die Frage, die ich gefragt habe. Wie kann ich eine Datei mit dem Objekt teilen, an dem ich gerade arbeite? Ich habe versucht, aber es ist zu groß und ich denke, dass das Beispiel meine Frage nicht richtig darstellt. – supercontra

1

Sie sapply dafür verwenden können:

sapply(l, i="jhpedraza", function(x,i) x[i]) 

oder von Indizes:

sapply(l, i=1, function(x,i) x[i]) 

Dann können Sie plyr Paket verwenden, um sie innerhalb eines data.frame zu erhalten, die zum Zeichnen verwendet werden kann;

library(plyr) 
df1 <- ldply(sapply(l, i=1, function(x,i) x[i]), data.frame) 

Beispiel Grundstück:

ggplot() + geom_line(aes(x=as.numeric(.id),y=X..i..), 
       data = df1, stat="identity") + 
    scale_x_continuous(breaks=as.numeric(df1$.id), labels=as.numeric(df1$.id)) + 
    ggtitle("Example Plot") + labs(x="Year", y="Value") + 
     theme(panel.background = element_rect(fill = "#eff0f1", 
            colour = "#eff0f1"), 
     plot.background = element_rect(fill = "#eff0f1")) 
 

      https://i.stack.imgur.com/9kWUN.png 


Update: Wie mit fehlenden Werten in der Liste umgehen?

Wie Sie erwähnt haben Sie fehlende und Nullwerte, verschiedene Spalten, usw. in Ihrer Liste, kann diese Ihnen helfen:

df.completed <- plyr::ldply(lapply(l, Filter, f = Negate(is.null)),rbind) 

Dieses Sie eine Datenrahmen geben wird, die Zeilen für jedes Jahr hat (jeder Datenrahmen in deiner Liste) und jeder Spalte. Fehlende Spaltenwerte werden mit NA gefüllt.

Für Ihr Beispiel Dataset wäre dies der Ausgang sein:

# > df.completed 

# .id jhpedraza didactech juanmanuelcorzo lasillaenvivo milobeta char_arturo 
# 1 2011 0.011219120 0.01196631  0.01121912   NA   NA   NA 
# 2 2012 0.005208632   NA    NA 0.005434868   NA   NA 
# 3 2013 0.004571227   NA    NA   NA 0.003627828 0.003429278 

Und Sie können jede der Spalten wie folgt plotten (nur jhpedraza auf die gewünschte Spalte ändern):

ggplot() + geom_line(aes(x=as.numeric(.id),y=jhpedraza), 
      data = df.completed[complete.cases(df.completed$jhpedraza),], stat="identity") + 
    scale_x_continuous(breaks=as.numeric(df1$.id), labels=as.numeric(df1$.id)) + 
    ggtitle("Example Plot") + labs(x="Year", y="jhpedraza") + theme_bw() 
 

      https://i.stack.imgur.com/emNAo.png 

+0

Das ist großartig, danke! Ich bekomme diesen Fehler, wenn ich den Benutzernamen benutze, den ich wirklich brauche: > df1 <- ldply (sapply (l, ich = "jhpedraza", Funktion (x, i) x [i]), data.frame) Fehler in FUN (X [[i]], ...): Zeilennamen enthalten fehlende Werte – supercontra

+0

nicht jeder Benutzer hat einen Wert für jedes Jahr und sie sind nicht in einer bestimmten Reihenfolge, deshalb wird der Index nicht funktionieren ... – supercontra

+0

Ich habe immer noch kein Problem mit '' jhpedraza''. Stellen Sie ein data.set bereit, das den Fehler reproduziert. – Masoud

Verwandte Themen