[问题] (救回) loop 中 cell 内细格等于变项

楼主: celestialgod (天)   2016-11-20 14:54:54
相关作者讯息已经遮蔽
想要请问一下
我现在想要进行
c[1]=a1 (已知变项)
.
.
.
c[8]=a8
以下是我写得loop
a1=2
a2=3
a3=4
a4=5
a5=6
a6=7
a7=8
a8=9
c=1:8
t=data.frame(c)
attach(t)
for(i in 1:8) c[i] <- (paste('a',i,sep=""))
但没想到c都变成文字的a1 而非变项内容
我想要的是如何把一些规律的变项 变成一个data.frame
这样我才可以对这个data.frame进行观看分布状况 就是常用的bootstrap 的最后的步骤
不知道要怎样修改我原本的code
或是有更快或简单的code 可以把a1-a8 变成一个data 呢?
谢谢
楼主: celestialgod (天)   2015-01-19 08:50:00
sapply(1:8, function(i)get(paste0("a". i)))
作者: obarisk (OSWALT)   2015-01-19 09:18:00
http://r4stats.com/books/r4sas-spss/我觉得sas和r的程式思维差很多,要把sas的思维强制加到r上,是有可能的,只是不确定有没有人这样做也许你可以找那本书看看,或者从更基础的r程式思维学起否则学起来会很累我试着用以下程式回答你的问题如果你的资料可以化为2维的阵列,那data.frame是最简单的若是每笔资料都是data.frame,那就会用到list## 产生资料da <- matrix(0, 100, 8)## 每栏都是常态分配乱数for(i in 1:ncol(da)){da[, i]<-rnorm(nrow(da, 0, 1))}colnames(da) <- paste0('var', 1:ncol(da))## 要对每个栏做某些事情for( i in 1:ncol(da) ){do_something(da[, i])}## 没有用到字段名称## 如果需要存下for循环内的资料l1 <- list()for( i in 1:ncol(da) ){l1[[i]] <- do_something(da[, i])}##################################################如果要用你原来的方式硬解问题,就会牵涉到NSE(Non-standard evaluation),学这个要花不少心力至少要搞懂变量和字串在r中的差别,配合assigneval和parse这些函式例如## 定义一个函式处理eval(parse(text='string'))EV <- function(x) { eval(parse(text=x)) }## 产生变量vars <- paste0('var', 1:8)for( i in 1:length(vars) ){assign(vars[i], anykindofdataInR)}## dosomething on varsfor( i in 1:length(vars) ){do_something(EV(vars[i]))}##################只是上面这个方式很不像r就是了
作者: andrew43 (讨厌有好心推文后删文者)   2015-01-19 11:53:00
像楼上这样写法也有可能大幅降低运算效率。也容易犯错。建议原po不要永久地考虑这种方式。换成R风格才容易长久使用下去。否则eval()个不停,会累死自己。
作者: obarisk (OSWALT)   2015-01-19 18:33:00
r 已经超级有弹性了...
作者: gsuper (Logit(odds))   2015-01-19 22:50:00
get() 好像不错, 比邪恶的贴上短些
作者: Wush978 (拒看低质媒体)   2015-01-20 01:19:00
既然要这样写loop, 就应该把a1 ~ a8 放到一个list中建议把list学会,然后学一下environment解这种问题就再也不用eval + parse硬干了
楼主: celestialgod (天)   2015-01-20 13:31:00
改变储存资料的方式,才是活用R的方式。直接读入资料为data. frame,不要事后用循环处理。
作者: obarisk (OSWALT)   2015-01-20 18:07:00
list和 env大好

Links booklink

Contact Us: admin [ a t ] ucptt.com