我将R中的一些数据存储在data.frame中,如下所示:
time value
53 5
55 5
59 7
61 9
79 6
118 11
200 5
我希望按时间方式提取数据,制作60秒(时间以秒为单位)。但是,我想要做的是创建一个新的data.frame,它只保留每个存储桶的第一个和最后一个条目。我知道我可以通过循环轻松完成这项工作但我的问题是如何告诉R找到存储桶的第1个和最后一个元素。
答案 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