首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用sqldf包创建时间间隔

使用sqldf包创建时间间隔
EN

Stack Overflow用户
提问于 2014-01-19 06:10:24
回答 3查看 1.1K关注 0票数 1

这就是我的数据框架的样子。

我希望创建15分钟或30分钟的时间间隔,并在该时间间隔内为所有时间戳设置No_Words之和。我需要这个来画出每个时间间隔的平均单词数。

我该怎么做呢?

另外,我真的很想知道是否可以使用sqldf包解决方案。

代码语言:javascript
运行
复制
               Time                 No_Words
1   2013-11-17 13:37:00                    6    
2   2013-11-17 13:37:00                   16    
3   2013-11-17 13:37:00                   18    
4   2013-11-17 13:37:00                   12    
5   2013-11-17 14:03:00                    5    
6   2013-11-17 14:03:00                   20    
7   2013-11-17 14:04:00                    4    
8   2013-11-17 17:21:00                   39    
9   2013-11-17 22:48:00                   19    
10  2013-11-17 22:48:00                   12    
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-19 08:00:34

代码语言:javascript
运行
复制
# generate example data, 30 min intervals
set.seed(1)
dateseq <- seq(as.POSIXct("2013-11-17"), as.POSIXct("2013-11-18"), by="min")
df <- data.frame(Time=dateseq[sample(1:length(dateseq), 500)],
                 No_Words=sample(1:100, 500, replace=T))
groups <- cut.POSIXt(df$Time, breaks="30 min")

使用sqldf的艰难之路

代码语言:javascript
运行
复制
library(sqldf)
df$groups <- groups
agg <- sqldf("select groups, avg(No_Words) from df group by groups", row.names=T)
row.names(agg) <- agg[,1]
agg <- as.matrix(agg)
class(agg) <- "numeric"
par(mar=c(2,10,0,0)); barplot(agg[,2], horiz=TRUE, las=1)

使用例如tapply的简单方法

代码语言:javascript
运行
复制
agg <- tapply(df$No_Words, list(groups), mean)
par(mar=c(2,10,0,0)); barplot(agg, horiz=TRUE, las=1)
票数 1
EN

Stack Overflow用户

发布于 2014-01-19 12:53:49

sqldf 这里是一个sqldf解决方案,其中输入数据帧是DF

代码语言:javascript
运行
复制
library(sqldf)

min15 <- 15 * 60 # in seconds
ans <- fn$sqldf("select
       t.Time - t.Time % $min15 as Time, 
       sum(t.No_Words) as No_Words
    from DF t 
    group by Time")
plot(No_Words ~ Time, ans, type = "o")

给予:

代码语言:javascript
运行
复制
> ans
                 Time No_Words
1 2013-11-17 13:30:00       52
2 2013-11-17 14:00:00       29
3 2013-11-17 17:15:00       39
4 2013-11-17 22:45:00       31

如果需要一个密集网格,那么我们将需要一个网格数据帧G,它是我们与以前的ans连接的(注意,sqldf拉入chron包,所以我们使用它的trunc函数):

代码语言:javascript
运行
复制
# create grid G
rng <- range(as.POSIXct(trunc(as.chron(DF$Time), 15 / (24 * 60))))
G <- data.frame(Time = seq(rng[1], rng[2], by = min15))

ans2 <- sqldf("select Time, coalesce(No_Words, 0) as No_Words 
         from (select * from G left join ans using(Time))")
plot(No_Words ~ Time, ans2, type = "o")

ans2的前几行是:

代码语言:javascript
运行
复制
> head(ans2)

                 Time No_Words
1 2013-11-17 13:30:00       52
2 2013-11-17 13:45:00        0
3 2013-11-17 14:00:00       29
4 2013-11-17 14:15:00        0
5 2013-11-17 14:30:00        0
6 2013-11-17 14:45:00        0

我们还展示了动物园的解决方案:

代码语言:javascript
运行
复制
library(zoo)
library(chron)
FUN <- function(x) as.POSIXct(trunc(as.chron(x), 15 / (24 * 60)))
z <- read.zoo(DF, FUN = FUN, aggregate = sum)
plot(z)

这给了z

代码语言:javascript
运行
复制
> z
2013-11-17 13:30:00 2013-11-17 14:00:00 2013-11-17 17:15:00 2013-11-17 22:45:00 
             52                  29                  39                  31 

注意:我们使用了这些数据,特别是Time属于"POSIXct"

代码语言:javascript
运行
复制
Lines<- " Time            No_Words
1   2013-11-17 13:37:00                    6    
2   2013-11-17 13:37:00                   16    
3   2013-11-17 13:37:00                   18    
4   2013-11-17 13:37:00                   12    
5   2013-11-17 14:03:00                    5    
6   2013-11-17 14:03:00                   20    
7   2013-11-17 14:04:00                    4    
8   2013-11-17 17:21:00                   39    
9   2013-11-17 22:48:00                   19    
10  2013-11-17 22:48:00                   12   
"

raw <- read.table(text = Lines, skip = 1)
DF <- data.frame(Time = as.POSIXct(paste(raw$V2, raw$V3)), No_Words = raw$V4)
票数 2
EN

Stack Overflow用户

发布于 2014-01-19 07:44:57

这个答案不是sqldf,而是基R函数aggregatecut

代码语言:javascript
运行
复制
## If your "Time" column is not an actual time object, 
##    convert it to one before proceeding.
mydf$Time <- as.POSIXct(mydf$Time)

cut可以创建时间回收箱。我们将使用它来进行聚合。您可以使用formula表示法,但是我使用了list方法,这样就可以很容易地指定结果的列名:

代码语言:javascript
运行
复制
## Aggregate data in 30 minute chunks
aggregate(list(No_Words = mydf$No_Words), 
          list(Time = cut(mydf$Time, "30 min")), FUN = mean)
#                  Time No_Words
# 1 2013-11-17 13:37:00 11.57143
# 2 2013-11-17 17:07:00 39.00000
# 3 2013-11-17 22:37:00 15.50000

## Aggregate data into 15 minute chunks
aggregate(list(No_Words = mydf$No_Words), 
          list(Time = cut(mydf$Time, "15 min")), FUN = mean)
#                  Time  No_Words
# 1 2013-11-17 13:37:00 13.000000
# 2 2013-11-17 13:52:00  9.666667
# 3 2013-11-17 17:07:00 39.000000
# 4 2013-11-17 22:37:00 15.500000
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21213793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档