2016-05-11 15 views
0

Ich habe ein Korpus von Tweets zusammengestellt in den letzten paar Monaten, die in etwa so aussieht (der eigentliche Korpus hat viel mehr Spalten und offensichtlich viel mehr Zeilen , aber Sie erhalten die Idee)Zeichnen der Häufigkeit der Streichhölzer über die Zeit in R

id  when   time  day month year handle what 
UK1.1 Sat Feb 20 2016 12:34:02 20 2  2016 dave Great goal by #lfc 
UK1.2 Sat Feb 20 2016 15:12:42 20 2  2016 john Can't wait for the weekend 
UK1.3 Sat Mar 01 2016 12:09:21 1 3  2016 smith Generic boring tweet 

Nun, was ich in R tun möchte ist, grep für String-Matching, die Häufigkeit bestimmter Wörter/Hashtags im Laufe der Zeit plotten, idealerweise durch die Anzahl der Tweets normalisiert von diesem Monat/Tag/Stunde/was auch immer. Aber ich habe keine Ahnung, wie ich das machen soll.

Ich weiß, wie Sie mit Grep Teilmengen dieses Datenrahmens, z. für alle Tweets einschließlich des #lfc Hashtags, aber ich weiß nicht wirklich, wo ich von dort aus hingehen soll.

Das andere Problem ist, dass jede Zeitskala auf meiner X-Achse (Stunde/Tag/Monat etc.) muss numerisch sein, und die Spalte "wenn" ist nicht. Ich habe versucht, die Spalten "Tag" und "Monat" in etwas wie "2.13" für den 13. Februar zu verketten, aber das führt dazu, dass R 2.13 als "früher" behandelt, sozusagen als 2.7 (7. Februar) aus mathematischen Gründen.

Also im Grunde I'd like to make plots like these, where frequency of string x is plotted against time

Dank!

+4

Es sieht so aus, als ob Sie ein paar Probleme haben. Es kann ratsam sein, sie in kleinere Ausgaben mit getrennten Fragen aufzuteilen. –

Antwort

1

Hier ist eine Möglichkeit, Tweets am Tag zu zählen. Ich habe mit einem vereinfachten gefälschten Datensatz dargestellt:

library(dplyr) 
library(lubridate) 

# Fake data 
set.seed(485) 
dat = data.frame(time = seq(as.POSIXct("2016-01-01"),as.POSIXct("2016-12-31"), length.out=10000), 
       what = sample(LETTERS, 10000, replace=TRUE)) 

tweet.summary = dat %>% group_by(day = date(time)) %>% # To summarise by month: group_by(month = month(time, label=TRUE)) 
    summarise(total.tweets = n(), 
      A.tweets = sum(grepl("A", what)), 
      pct.A = A.tweets/total.tweets, 
      B.tweets = sum(grepl("B", what)), 
      pct.B = B.tweets/total.tweets)    

tweet.summary 
  day total.tweets A.tweets  pct.A B.tweets  pct.B 
1 2016-01-01   28  3 0.10714286  0 0.00000000 
2 2016-01-02   27  0 0.00000000  1 0.03703704 
3 2016-01-03   28  4 0.14285714  1 0.03571429 
4 2016-01-04   27  2 0.07407407  2 0.07407407 
... 

Hier ist ein Weg, um die Daten zu zeichnen ggplot2 verwenden. Ich habe zusammengefasst auch den Datenrahmen im Fluge innerhalb ggplot, mit den dplyr und reshape2 Pakete:

library(ggplot2) 
library(reshape2) 
library(scales) 

ggplot(dat %>% group_by(Month = month(time, label=TRUE)) %>% 
     summarise(A = sum(grepl("A", what))/n(), 
        B = sum(grepl("B", what))/n()) %>% 
     melt(id.var="Month"), 
     aes(Month, value, colour=variable, group=variable)) + 
    geom_line() + 
    theme_bw() + 
    scale_y_continuous(limits=c(0,0.06), labels=percent_format()) + 
    labs(colour="", y="") 

enter image description here

In Bezug auf Ihre Datumsformatierung Problem, hier ist, wie numerische Daten zu bekommen: Sie können die Wende Geben Sie unter "as.Date" Tages- und Jahresspalten in ein Datum ein und/oder stellen Sie die Spalten "Tag", "Monat", "Jahr" und "Uhrzeit" mithilfe von as.POSIXct in eine Datums-/Uhrzeitspalte. Beide haben zugrunde liegende numerische Werte mit einer angefügten Datumsklasse, so dass R sie als Daten in Zeichenfunktionen und anderen Funktionen behandelt. Sobald Sie diese Konvertierung durchgeführt haben, können Sie den Code oben laufen Tweets von Tag zu zählen, Monat usw.

# Fake time data 
dat2 = data.frame(day=sample(1:28, 10), month=sample(1:12,10), year=2016, 
        time = paste0(sample(c(paste0(0,0:9),10:12),10),":",sample(10:50,10))) 

# Create date-time format column from existing day/month/year/time columns 
dat2$posix.date = with(dat2, as.POSIXct(paste0(year,"-", 
             sprintf("%02d",month),"-", 
             sprintf("%02d", day)," ", 
             time))) 

# Create date format column 
dat2$date = with(dat2, as.Date(paste0(year,"-", 
             sprintf("%02d",month),"-", 
             sprintf("%02d", day)))) 

dat2 
day month year time   posix.date  date 
1 28 10 2016 01:44 2016-10-28 01:44:00 2016-10-28 
2 22  6 2016 12:28 2016-06-22 12:28:00 2016-06-22 
3 3  4 2016 11:46 2016-04-03 11:46:00 2016-04-03 
4 15  8 2016 10:13 2016-08-15 10:13:00 2016-08-15 
5 6  2 2016 06:32 2016-02-06 06:32:00 2016-02-06 
6 2 12 2016 02:38 2016-12-02 02:38:00 2016-12-02 
7 4 11 2016 00:27 2016-11-04 00:27:00 2016-11-04 
8 12  3 2016 07:20 2016-03-12 07:20:00 2016-03-12 
9 24  5 2016 08:47 2016-05-24 08:47:00 2016-05-24 
10 27  1 2016 04:22 2016-01-27 04:22:00 2016-01-27 

können Sie sehen, dass die zugrunde liegenden Werte eines POSIXct Datum sind numerisch (Anzahl der seit Mitternacht am 1. Januar 1970 verstrichenen Sekunden), indem as.numeric(dat2$posix.date) getan wird. Ähnlich für ein Date-Objekt (Anzahl der Tage seit dem 1. Januar 1970): as.numeric(dat2$date).

+0

Vielen Dank! Das funktioniert perfekt. Das einzige Problem, das ich habe, ist, dass wenn ich die Posix-Datumsspalte (Kombination von Datum und Uhrzeit) erstelle, es immer noch nur das Datum angibt. Es ist buchstäblich nur die Zeit vollständig auslassen, obwohl die Zeit Spalte das richtige Format/Klasse ist. – Iarwain

+0

Hmm ... Können Sie ein kleines Beispiel der Daten, mit denen Sie begonnen haben, und den Code, den Sie ausgeführt haben, um es in POSIXct zu konvertieren?Um das Datenbeispiel zu veröffentlichen, fügen Sie in Ihre Frage die Ausgabe von 'dput (dataSample)' ein. – eipi10

+0

Entschuldigung für die Verzögerung in diesem - Ich habe den exakt gleichen Code auf einer kleinen Probe der Daten versucht und es hat gut funktioniert, aber es funktioniert immer noch nicht für den gesamten Datensatz (der über 16 Millionen Zeilen ist). Könnte es ein Problem der Datenrahmengröße sein? Ich habe Ihren Code verwendet, wobei 'Jahr', 'Monat' und 'Tag' alle Ganzzahlen sind und 'Zeit' ein Faktor ist: 'data $ datetime = with (data, as.POSIXct (paste0 (year," - ", sprintf ("% 02d", Monat), "-", sprintf ("% 02d", Tag), "", Uhrzeit))) ' Was ist seltsam ist, dass die Datetime-Spalte * ist * das richtige Format (" POSIXct " "POSIXt"), und es druckt als "2015-01-20 GMT" aus, aber gerade ohne Zeit! – Iarwain

Verwandte Themen