从列表中选择data.frame并从字符串中调用对象
我想复制Tsay在《金融时间序列》一书中的一个表,并意识到即使我能够做到这一点,我的代码似乎很笨拙,而且充满了糟糕的做法。 我尝试了一点plyr,但没有真正为我工作 这是我的代码:从列表中选择data.frame并从字符串中调用对象,r,R,我想复制Tsay在《金融时间序列》一书中的一个表,并意识到即使我能够做到这一点,我的代码似乎很笨拙,而且充满了糟糕的做法。 我尝试了一点plyr,但没有真正为我工作 这是我的代码: library(fBasics) url= 'http://faculty.chicagobooth.edu/ruey.tsay/teaching/fts3/d-ibm3dx7008.txt' table1.2 = read.table(url,header=T) l1=lapply(table1.2,basic
library(fBasics)
url= 'http://faculty.chicagobooth.edu/ruey.tsay/teaching/fts3/d-ibm3dx7008.txt'
table1.2 = read.table(url,header=T)
l1=lapply(table1.2,basicStats)
naml1 = names(l1)
datmat = as.data.frame(matrix(0,nrow=nrow(l1$Date),ncol=4))
nams = names(l1)
j=1
for( i in nams){
datmat[,j] = eval(parse(text=paste("l1",i,sep="$")))
j=j+1
}
rownames(datmat)= rownames(l1[[1]])
colnames(datmat)=colnames(table1.2)
我不在乎日期的汇总统计,所以把它丢掉吧
datmat =datmat[,-1]
所以我听说应该尽可能避免eval(parse(text=)函数,我尝试了get函数,但没有成功
我只是想开始摆脱糟糕的编程习惯,所以任何建议都是非常受欢迎的。欢迎这么说,我试图弄清楚你想要做什么,但除了阅读你的数据集,我无法得到你想要做的。尽管如此,我还是试着提出一些建议。如果你编辑你的p,也许我可以进一步帮助你ost可以更精确一点
l1
datmat <- setNames(as.data.frame(l1), names(l1))
您可以很容易地将等长向量列表放入data.frame,然后只需更改名称
> df.stats <- as.data.frame(lapply(table1.2,basicStats)[-1])
Warning message:
In sum(X) : Integer overflow - use sum(as.numeric(.))
> names(df.stats) <- names(table1.2)[-1]
> str(df.stats)
'data.frame': 16 obs. of 4 variables:
$ rtn : num 9.84e+03 0.00 -2.30e-01 1.32e-01 -8.57e-03 ...
$ vwretd: num 9.84e+03 0.00 -1.71e-01 1.15e-01 -4.25e-03 ...
$ ewretd: num 9.84e+03 0.00 -1.04e-01 1.07e-01 -2.57e-03 ...
$ sprtr: num 9.84e+03 0.00 -2.05e-01 1.16e-01 -4.87e-03 ...
>df.stats名称(df.stats)str(df.stats)
“数据帧”:4个变量中的16个对象:
$rtn:num 9.84e+03 0.00-2.30e-01 1.32e-01-8.57e-03。。。
$vwrett:num 9.84e+03 0.00-1.71e-01 1.15e-01-4.25e-03。。。
$ewretd:num 9.84e+03 0.00-1.04e-01 1.07e-01-2.57e-03。。。
$sprtr:num 9.84e+03 0.00-2.05e-01 1.16e-01-4.87e-03。。。
结果与您构建的完全一样。为什么要经历所有这些。看起来您正在做的是函数basicStats已经做过的事情。这看起来太简单了,不可能是正确的,但我认为下面给出了相同的输出:
basicStats(table1.2)[,-1]
哎呀,赞成的评论得到的票数比答案还多?;)
basicStats(table1.2)[,-1]