用R表示数据

时间:2014-04-20 22:32:10

标签: r dataframe bucket

我将R中的一些数据存储在data.frame中,如下所示:

time     value
53       5
55       5
59       7
61       9
79       6
118      11
200      5

我希望按时间方式提取数据,制作60秒(时间以秒为单位)。但是,我想要做的是创建一个新的data.frame,它只保留每个存储桶的第一个和最后一个条目。我知道我可以通过循环轻松完成这项工作但我的问题是如何告诉R找到存储桶的第1个和最后一个元素。

2 个答案:

答案 0 :(得分:7)

data.table使这很方便。在这里,为每分钟的第一个和最后一个值添加列:

xt <- data.table(x)
xt[,first:=head(.SD,1), by=time %/% 60]
xt[,last:=tail(.SD,1), by=time %/% 60]
xt
##    time value first last
## 1:   53     5     5    7
## 2:   55     5     5    7
## 3:   59     7     5    7
## 4:   61     9     9   11
## 5:   79     6     9   11
## 6:  118    11     9   11
## 7:  200     5     5    5

这是一个简单的方法来修剪到分钟桶。修改time列,使其指示分钟的头部,移除value列,然后转到unique

xt$time <- 60 * xt$time %/% 60
xt$value <- NULL
unique(xt)
##    time first last
## 1:    0     5    7
## 2:   60     9   11
## 3:  180     5    5

要获取每分钟第一行和最后一行的时间和值,aggregate.data.frame效果很好,但需要两次通过。

第一个值:

aggregate(cbind(time, value) ~ time %/% 60, data=x, FUN=head, 1)
##   time%/%60 time value
## 1         0   53     5
## 2         1   61     9
## 3         3  200     5

最后的值:

aggregate(cbind(time, value) ~ time %/% 60, data=x, FUN=tail, 1)
##   time%/%60 time value
## 1         0   59     7
## 2         1  118    11
## 3         3  200     5

然后可以将它们组合成所需的输出。

答案 1 :(得分:0)

似乎时间是递增的,所以这给出了每个桶中第一个或最后一个60秒的行的子集。

subset(DF, time %in% unlist(tapply(time, time %/% 60 * 60, range)))

,并提供:

  time value
1   53     5
3   59     7
4   61     9
6  118    11