以下是为各种测试条件和重复测试生成一些y值的示例代码。
library(data.table)
headings = seq(0,180,30)
spds=c(5,10,20,30)
tests=seq(5)
ts=seq(30*60)
dt <- data.table(hd = rep(headings,each=length(spds)*length(tests)*length(ts)),
spd = rep(spds,each=length(tests)*length(ts)),
test = rep(tests,each=length(ts)),
t = ts/60
)
set.seed(1)
dt$y <- with(dt, ((spd/22)^2 * (sin(pi/180*t) +
runif(nrow(dt),-1,1)) * runif(nrow(dt))))
每个测试的数据都需要一些处理,并返回一个值表。这是一个简单的函数,用于返回范围内的索引,时间和y值。
findGood<-function(x,ylim) {
gt <- which(ylim[1] <= x$y & x$y <= ylim[2])
dt <- data.table(indx=gt, t=x$t[gt], y=x$y[gt])
return(dt)
}
使用“by”循环测试条件和重复点,为每个测试条件组合生成结果列表。
ylim=c(.3,.45)
t_for_good_y <- by(dt[,c('t','y'),with=FALSE],
dt[,c('hd','spd','test'),with=FALSE],
findGood,ylim)
以下内容将结果转换回数据表。但是,该表不包含条件值(hd,spd,test)
tg <- rbindlist(t_for_good_y)
如何将列表t_for_good_y转换为数据表,但为每个列表项表示的条件添加列(在此示例中为hd,spd和test)
一种可能的方法是使用dimnames
dn <- dimnames(t_for_good_y)
dn包含列表索引的名称和值
R> str(dn)
List of 3
$ hd : chr [1:7] "0" "30" "60" "90" ...
$ spd : chr [1:4] "5" "10" "20" "30"
$ test: chr [1:5] "1" "2" "3" "4" ...
R> print(dn)
$hd
[1] "0" "30" "60" "90" "120" "150" "180"
$spd
[1] "5" "10" "20" "30"
$test
[1] "1" "2" "3" "4" "5"
R> names(dn)
[1] "hd" "spd" "test"