我正在尝试编写一个代码,用于标识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))
谢谢!
答案 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
。