2014-09-08 45 views
5

Çok ihtiyacım olan cevapları almak için R için çok yeni bir fonksiyona sahip olmak ve işlevlerini çalıştırmakta zorluk çekiyorum. zamanla sitelerine ilgili olarakR ile yardım ve gruplama/toplama/* apply/data.table

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 

Amacım farklı kelimelerin geçtiği trendlere yönelik görünüyor şudur: Ben örnek verileri şuna benzer

http://pastebin.com/z9Ti3nHB

PCSTest var.

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")) 

bu veren: Onları sayabilir

    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 

veya hepsini çizmek:

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

şimdi veriler üzerinde bazı hesaplamalar yapmanız gereken Bu yüzden,

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

veren: bu son sonucu istiyoruz ne

  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 

hesaplanan günlük ortalama frekansı, gibi bir şey ... toplamı (frekans)/20 gün, olan bir sütundur veri, belki de hareketli bir ortalama. Ayrıca, eğim/doğrusal regresyon ile başka bir sütun istiyorum. Toplam işlevde bunu nasıl hesaplayabilirim? Ya da bunlardan herhangi birini nasıl daha iyi/daha hızlı yapardım? Uygulamanın ve data.table işlevlerin olduğunu biliyorum ama onları nasıl kullanacağımı göremiyorum. Herhangi bir yardım büyük takdir edilecektir!

cevap

1

Tam olarak ne yapmak istediğinizden emin değilim, ancak dplyr (veya plyr) size yardımcı olacaktır. İşte örnekler. İstediğinizi açıkça söylerseniz, daha fazla yardım alırsınız.

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 Sorunuzda 20 gün boyunca ortalama sıklık almak istediğinizi belirttiniz. Tarih aralığını belirtmek isterseniz, 'filter()' işlevini kullanabilirsiniz. 'Filter() 'ile alt kümeniz var. Böyle bir şey. filtre (d, Tarih> = "2012-09-01", Tarih <= "2012-09-25") – jazzurro