【问题标题】:Help with R and grouping/aggregate/*apply/data.table帮助 R 和 grouping/aggregate/*apply/data.table
【发布时间】:2014-09-08 20:18:42
【问题描述】:

我对 R 非常陌生,无法运行函数来获得我需要的答案。我有示例数据 PCSTest

http://pastebin.com/z9Ti3nHB

看起来像这样:

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

我的目标是寻找随着时间推移与网站相关的不同单词出现的趋势。我可以数一数:

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

这给出了这个:

                  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

或全部绘制:

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

我现在需要对数据做一些计算,所以我尝试了聚合

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

给出:

           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

我希望在最后一个结果中有一列具有每天的平均频率,例如... sum(freq)/20 天,根据数据计算得出,甚至可能是移动平均值。 另外,我想要另一列带有斜率/线性回归的列。我将如何在聚合函数中计算?

或者,我怎样才能使这一切变得更好/更快?我知道有 apply 和 data.table 函数,但我不知道如何使用它们。任何帮助将不胜感激!

【问题讨论】:

    标签: r data-visualization average ggplot2


    【解决方案1】:

    我不确定你到底想做什么,但dplyr(或plyr)会帮助你。 这里是例子。如果你明确说出你想要什么,你会得到更多的帮助。

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

    【讨论】:

    • @Oleg 您提到您希望在问题中获得 20 天的平均频率。如果要指定日期范围,可以使用filter()。您正在使用 filter() 进行子集化。像这样的东西。 filter(d, Date &gt;= "2012-09-01", Date &lt;= "2012-09-25")
    猜你喜欢
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多