列表中的data.frame和字符串中的调用对象

时间:2011-10-29 18:51:18

标签: 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,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但是没有用。

我只是想开始摆脱糟糕的编程习惯,所以任何建议都非常受欢迎。

4 个答案:

答案 0 :(得分:7)

为什么要经历这一切。看来你正在做的函数basicStats已经做了。这似乎太简单了,但我认为以下内容为您提供相同的输出:

basicStats(table1.2)[,-1]

答案 1 :(得分:0)

欢迎来到SO,我试图弄清楚你想做什么,但除了阅读你的数据集,我无法得到你想做的事情。尽管如此,我还是想提出一些建议。如果你编辑你的帖子,我可以帮助你进一步提高一点。

  1. 在分配变量时使用< - 而不是=。这是R方式。
  2. 如果你还没有使用RStudio,那就去吧,它会对你有很大帮助,因为它有很好的自动完成功能,并且有很好的帮助集成。 (您可以使用alt + - 来获取< - 在rstudio中,以帮助您习惯它)
  3. R是一种矢量化语言,通常你不需要循环,例如:paste(l1,nams,sep="$")没有循环。
  4. 你已经在使用lapply,这很好。通常,它可以很好地编写一个函数,然后将这个函数与lapply结合起来并在我们的数据上使用它。
  5. 通过一些更好的介绍来阅读,或者扫描更高级的资源 - 即使它们没有涵盖您的特定问题,也是值得的。花点时间去做它是值得的。

    以下是crossvalidated (stackexchange's stats site)

  6. 的相关讨论

答案 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 ...

完全像你构建的那样结束。