我想从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,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)
我不关心Date的摘要统计,所以就这样摆脱它。
datmat =datmat[,-1]
所以我听说eval(解析(text =应该尽可能避免。我尝试使用函数get但是没有用。
我只是想开始摆脱糟糕的编程习惯,所以任何建议都非常受欢迎。
答案 0 :(得分:7)
为什么要经历这一切。看来你正在做的函数basicStats已经做了。这似乎太简单了,但我认为以下内容为您提供相同的输出:
basicStats(table1.2)[,-1]
答案 1 :(得分:0)
欢迎来到SO,我试图弄清楚你想做什么,但除了阅读你的数据集,我无法得到你想做的事情。尽管如此,我还是想提出一些建议。如果你编辑你的帖子,我可以帮助你进一步提高一点。
paste(l1,nams,sep="$")
没有循环。lapply
结合起来并在我们的数据上使用它。 通过一些更好的介绍来阅读,或者扫描更高级的资源 - 即使它们没有涵盖您的特定问题,也是值得的。花点时间去做它是值得的。
答案 2 :(得分:0)
您可以在获得l1
datmat <- setNames(as.data.frame(l1), names(l1))
更简单的方法是使用describe
包
psych
函数
psych::describe(table1.2)
答案 3 :(得分:0)
您可以非常轻松地将等长矢量列表放入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 ...
完全像你构建的那样结束。