R:使用“by”生成的表的合并列表并添加标识符

时间:2015-01-13 16:11:18

标签: r data.table rbind factors

以下是为各种测试条件和重复测试生成一些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"

0 个答案:

没有答案