【问题标题】:Aggregate zoo time series of tweets from multiple accounts聚合来自多个帐户的动物园时间序列推文
【发布时间】:2015-07-08 14:28:32
【问题描述】:

在 R 中聚合或合并动物园对象时,我设法让自己陷入停顿,因为我不熟悉使用 R,尤其是使用时间序列数据。

谁能帮帮我?

我有许多数据框,它们提供了推文的创建日期及其 ID 用于一些特定的推特帐户

str(temp)
'data.frame':   1528 obs. of  2 variables:
 $ id_str    : chr  "605698007263260672" "605681239408963584" "603854670856069120" "601792133297786880" ...
 $ created_at: POSIXct, format: "2015-06-02 12:30:32" "2015-06-02 11:23:55" "2015-05-28 10:25:47" "2015-05-22 17:49:59" ...

我不知道推文的频率(创建日期值之间的间距),但我需要创建一个包含

的数据集
 TimeSeries AccountName NumOfTweets
   2010-01 MyTweeter 45
   2010-02 你的推特 5

我想根据创建的 进行分组,计算有多少个,并绘制它们以显示多个帐户在自记录开始以来的推文数量和持续活动。

关于如何处理合并或加入时间序列的任何建议,以便我可以用 x 轴上的时间序列和 Y 轴上的推文数量来绘制它们

使用 select_n() 获取并在下面使用 dput 提供的随机观察样本

dput(sample.df)
structure(list(id_str = c("235710687006035968", "148522094328680448", 
"555743466945523712", "139818931253813249", "601792133297786880", 
"391194341978669057", "455754624859779072", "139640022696603648", 
"182085980864528384", "372375117130526720"), created_at = structure(c(1345032781, 
1324245401, 1421334542, 1322170405, 1432313399, 1382102973, 1397495344, 
1322127750, 1332247655, 1377616120), class = c("POSIXct", "POSIXt"
), tzone = "")), .Names = c("id_str", "created_at"), row.names = c(882L, 
1363L, 33L, 1478L, 4L, 536L, 180L, 1489L, 1116L, 635L), class = "data.frame")

所需输出的示例,但在计算聚合并将多个数据帧(每个帐户 1 个)合并到合适的最终数据结构以进行绘图时需要帮助

【问题讨论】:

  • 请提供一个可重现的示例:基本上,潜在的回答者可以直接将粘贴复制到他们自己的 R 安装中以复制并解决您的问题。
  • 添加了使用 select_n 和 dput() 获取的数据样本
  • 添加了所需的最终情节的示例,只是不知道如何从这里到达那里

标签: r twitter time-series zoo


【解决方案1】:

这是否与您正在寻找的相似?首先,将created_at 转换为每月,并按 ID 和月份统计观察(推文):

# To have some counts > 1 and several observations per ID
set.seed(123)
df2 <- data.frame(sample(df$id_str, size = 50, replace = T),
                    sample(df$created_at, size = 50, replace = T))
colnames(df2) <- colnames(df)
# Convert to months
df2$Month <- strftime(df2$created_at, format = "%Y-%m")
result <- aggregate(df2$id_str, by = list(df2$id_str, df2$Month), FUN = length)
colnames(result) <- c("ID", "Month", "nTweets")
head(result)
#                   ID   Month nTweets
# 1 139640022696603648 2011-11       1
# 2 139818931253813249 2011-11       1
# 3 148522094328680448 2011-11       1
# 4 182085980864528384 2011-11       2
# 5 391194341978669057 2011-11       1
# 6 455754624859779072 2011-11       2 

然后您可以使用 ggplot 绘制结果:

library(ggplot2)
ggplot(result, aes(x = Month, y = nTweets, group = ID, color = ID)) + 
    geom_line(size = 2)

请注意,此处的 x 轴间距不正确,因为有些月份没有观察到。我想这对于完整的数据来说是不正确的。

【讨论】:

  • 感谢 Khl4v 非常接近,但我的错误是忘记提及示例数据集是来自 1 个帐户的输出,因此它代表该推特帐户随时间的活动,而不是由标识字段。如果您将 ID 替换为“tweet”文本,我需要计算每个月有多少条推文。此外,可能会有几个月没有记录任何推文,我需要在图中显示这一点,并且能够将具有相同结构的第二个数据帧添加到不同帐户的图中以显示差异
  • 我不清楚这段代码中发生了什么或需要设置种子。 df2
  • set.seed 需要始终从df 中提取相同的样本,以创建df2 并因此再现情节。您对自己的解决方案满意吗?那我要删除我的答案了。
【解决方案2】:

遵循 Khl4v 的代码并进行一些试验和错误

首先使用所需的格式化字符串将 char 列“created_at”转换为 Date 对象,以便将其识别为日期值

MyDataFrame <- mutate(MyDataFrame,created_at = as.POSIXct(created_at, format="%a %b %d %H:%M:%S %z %Y"))

现在将其转换为年月值,然后使用字符串“Tweets”创建一个名为 df2 的新数据框,随着年月值的变化,我们将很快计算下一个数据

df2 <- data.frame("Tweets",strftime(MyDataFrame$created_at, format = "%Y-%m"))

重命名列名,使其更加用户友好
colnames(df2)

result 包含组,即年月和推文的次数

result <- aggregate(df2$Tweeter, by = list(df2$TimePeriod), FUN = length)

在结果中添加另一列以存储所用高音扬声器帐户的名称

result  <- mutate(result ,Account ="MyTwitter")

重命名列名以使用户更友好

colnames(result) <- c("TimePeriod","Tweets","Tweeter")

使用 ggplot 绘制结果并旋转 x 标签,使其更易于阅读

ggplot(result, aes(x = TimePeriod, y = Tweets, group = Tweeter, color = Tweeter)) + geom_line(size = 1) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2012-02-27
    • 1970-01-01
    • 2012-03-30
    • 2013-02-26
    相关资源
    最近更新 更多