[問題] (救回) 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