2014-09-08 6 views
5

Ich bin sehr neu zu R und Probleme beim Ausführen von Funktionen, um die Antworten zu bekommen, die ich brauche. Ich habe beispielsweise Daten PCSTestHilfe mit R und Gruppierung/Aggregat/* apply/data.table

http://pastebin.com/z9Ti3nHB

, die etwa wie folgt aussieht:

Date  Site   Word 
-------------------------------------- 
9/1/2012 slashdot  javascript 
9/1/2012 stackexchange R 
9/1/2012 reddit   R 
9/1/2012 slashdot  javascript 
9/1/2012 stackexchange javascript 
9/5/2012 reddit   R 
9/8/2012 slashdot  javascript 
9/8/2012 stackexchange R 
9/8/2012 reddit   R 
9/8/2012 slashdot  javascript 
9/18/2012 stackexchange R 
9/18/2012 reddit   R 
9/18/2012 slashdot  javascript 
9/18/2012 stackexchange R 
9/27/2012 reddit   R 
9/27/2012 slashdot  R 

Mein Ziel für Trends in den Vorkommen verschiedenen Worte zu sehen aus, als sie auf Websites im Laufe der Zeit beziehen. Ich kann sie zählen:

library(plyr) 
PCSTest <- read.csv(file="c:/PCS/PCS Data - Test.csv", header=TRUE) 
PCSTest$Date <- as.Date(PCSTest$Date, "%m/%d/%Y") 
PCSTest$Date <- as.POSIXct(PCSTest$Date) 
countTest <- count(PCSTest, c("Date", "Site", "Word")) 

das gibt dies:

    Date   Site  Word freq 
1 2012-08-31 20:00:00  reddit   R 4 
2 2012-08-31 20:00:00  slashdot javascript 7 
3 2012-08-31 20:00:00 stackexchange javascript 1 
4 2012-08-31 20:00:00 stackexchange   R 2 
5 2012-09-01 20:00:00  reddit javascript 2 
6 2012-09-01 20:00:00  slashdot   R 3 
7 2012-09-04 20:00:00  reddit   R 1 
8 2012-09-07 20:00:00  reddit   R 1 
9 2012-09-07 20:00:00  slashdot javascript 2 
10 2012-09-07 20:00:00 stackexchange   R 1 
11 2012-09-09 20:00:00 stackexchange javascript 4 
12 2012-09-10 20:00:00  slashdot   R 4 
13 2012-09-14 20:00:00  reddit javascript 4 
14 2012-09-17 20:00:00  reddit   R 4 
15 2012-09-17 20:00:00  slashdot javascript 1 
16 2012-09-17 20:00:00 stackexchange   R 2 
17 2012-09-19 20:00:00  reddit javascript 2 
18 2012-09-23 20:00:00 stackexchange javascript 2 
19 2012-09-24 20:00:00  reddit javascript 3 
20 2012-09-24 20:00:00 stackexchange javascript 1 
21 2012-09-24 20:00:00 stackexchange   R 4 
22 2012-09-25 20:00:00  reddit javascript 5 
23 2012-09-25 20:00:00  slashdot javascript 3 
24 2012-09-25 20:00:00 stackexchange   R 7 
25 2012-09-26 20:00:00  reddit   R 1 
26 2012-09-26 20:00:00  slashdot   R 5 

oder zeichnen sie alle:

library(ggplot2) 
ggplot(data=countTest, aes(x=Date, y=freq, group=interaction(Site, Word), colour=interaction(Site, Word), shape=Site)) + geom_line() + geom_point() 

My plot of Frequency per day for Words per Site

Ich brauche jetzt einige Berechnungen auf den Daten zu tun , also habe ich versucht, Aggregat

aggregate(freq ~ Site + Word, data = countTest, function(freq) cbind(mean(freq), max(freq)))[order(-agg$freq[,3]),] 

die gibt:

  Site  Word freq.1 freq.2 
2  slashdot javascript 3.25 7.00 
5  slashdot   R 4.00 5.00 
1  reddit javascript 3.20 5.00 
4  reddit   R 2.20 4.00 
6 stackexchange   R 3.20 7.00 
3 stackexchange javascript 2.00 4.00 

Was ich in diesem letzten Ergebnis möchte eine Spalte, die die durchschnittliche Häufigkeit pro Tag hat, so etwas wie ... Summe (Freq)/20 Tage, von dem berechneten Daten, vielleicht sogar ein gleitender Durchschnitt. Auch möchte ich eine andere Spalte mit der Steigung/lineare Regression. Wie würde ich das in der Aggregatfunktion berechnen?

Oder, wie würde ich das alles besser/schneller machen? Ich weiß, dass es apply und data.table Funktionen gibt, aber ich sehe nicht, wie ich sie verwenden würde. Jede Hilfe würde sehr geschätzt werden!

Antwort

1

Ich bin mir nicht sicher, was Sie genau machen wollen, aber dplyr (oder plyr) wird Ihnen helfen. Hier sind Beispiele. Wenn Sie explizit sagen, was Sie wollen, erhalten Sie mehr Hilfe.

d <- read.csv("~/Downloads/r_data.txt") 
d$Date <- as.POSIXct(as.Date(d$Date, "%m/%d/%Y")) 

library(dplyr) 
d.cnt <- d %>% group_by(Date, Site, Word) %>% summarise(cnt = n()) 

# average per day 
date.range <- d$Date %>% range %>% diff %>% as.numeriC# gives 26 days or 
date.range <- d$Date %>% unique %>% length # gives 13 days 
d.ave <- d.cnt %>% group_by(Site, Word) %>% summarize(ave_per_day = sum(cnt)/date.range) 

# slope 
d.reg <- d.cnt %>% group_by(Site, Word) %>% 
    do({fit = lm(cnt ~ Date, data = .); data.frame(int = coef(fit)[1], slope = coef(fit)[2])}) 

# plot the slope value 
library(ggplot2) 
ggplot(d.reg, aes(Site, slope, fill = Word)) + geom_bar(stat = "identity", position = "dodge") 
+0

@Oleg Sie erwähnten, dass Sie die durchschnittliche Häufigkeit für 20 Tage in Ihrer Frage erhalten möchten. Wenn Sie den Datumsbereich angeben möchten, können Sie 'filter()' verwenden. Du unterteilst mit 'filter()'. Etwas wie das. 'filter (d, Datum> =" 2012-09-01 ", Datum <=" 2012-09-25 ")' – jazzurro