通过该序列r识别数据和子集中的时间序列

时间:2014-04-28 12:25:53

标签: r loops time-series subset

我正在尝试编写一个代码,用于标识R中的重复时间序列(以秒为单位)的长度,并将每个序列的子集放入其自己的数据框中,以进行曲线拟合和分析。每个序列是传感器电压输出的时间序列,必须单独分析。

我的代码看起来很笨重,但它的工作原理就像这里写的一样。我试图找出是否有一个包或简单的步骤,我缺少更优雅地做这件事。秒是十进制秒,数据可以是数字,也可以是整数,这个例子无关紧要。这不是实际的传感器输出,而是相同的格式。

set.seed(1)
all_data = data.frame( sec = rep(1.8:4,9), data = sample(1:27), data2 = sample(5:7))

#identify time step length in seconds
lowest = min(all_data$sec)
highest = max(all_data$sec)
#put into data frame
time_step = c(lowest,highest)

#find index of first time period
matches = match(time_step,all_data[,1])
#subset first time period
total_measures = nrow(all_data)/matches[2]
all_data = all_data[matches[1]:nrow(all_data),]
# test_frame = data.frame(c(1,2))
n = matches[2]

#counter for number of measures in file
count = c(1:(nrow(all_data)/n))
count2 = c(0:(nrow(all_data)/n-1))
# subset to break each measure into its own workable file
eq = paste("subd",count," = all_data[((",count2,"*n)+1):(",count,"*n),]",sep = "")
eval(parse(text = eq))

谢谢!

2 个答案:

答案 0 :(得分:2)

我会使用data.table为每个子集提供行ID。

require(data.table)
dt <- data.table(all_data)
dt[which.min(sec):nrow(dt), id:=1:.N, by=sec]

然后你可以像你一样继续分裂:

count <- 1:dt[, max(id, na.rm=TRUE)]
eq = paste("subd", count," = data.frame(dt[id==", count, ",list(sec, data, data2)])", sep = "")
eval(parse(text = eq))

或者,在R中更常见,您可以使用split拆分为子集。这将返回list data.frames。这非常有用,因为您可以使用lapply同时评估所有data.frames上的函数(曲线拟合等)。

split(data.frame(dt[, list(sec, data, data2)]), dt$id)

答案 1 :(得分:0)

我认为更为惯用的方法是为每个措施设置一个标签:

labl <- rep(count, each=n)

然后创建一个包含子文件

的列表
subds <- by(all_data, labl, I)

这会按标签分解all_data(I函数是标识 - 如果要以某种方式处理单个度量,可以用所需的功能替换I