[問題] (救回) loop 中 cell 內細格等於變項

看板R_Language作者 (天)時間7年前 (2016/11/20 14:54), 7年前編輯推噓7(7052)
留言59則, 6人參與, 最新討論串1/1
相關作者訊息已經遮蔽 想要請問一下 我現在想要進行 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 呢? 謝謝 -- ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1421623009.A.29A.html

01/19 08:50, , 1F
sapply(1:8, function(i)get(paste0("a". i)))
01/19 08:50, 1F

01/19 09:18, , 2F

01/19 09:19, , 3F
我覺得sas和r的程式思維差很多,要把sas的思維強制加到r
01/19 09:19, 3F

01/19 09:19, , 4F
上,是有可能的,只是不確定有沒有人這樣做
01/19 09:19, 4F

01/19 09:20, , 5F
也許你可以找那本書看看,或者從更基礎的r程式思維學起
01/19 09:20, 5F

01/19 09:20, , 6F
否則學起來會很累
01/19 09:20, 6F

01/19 09:28, , 7F
我試著用以下程式回答你的問題
01/19 09:28, 7F

01/19 09:30, , 8F
如果你的資料可以化為2維的陣列,那data.frame是最簡單的
01/19 09:30, 8F

01/19 09:32, , 9F
若是每筆資料都是data.frame,那就會用到list
01/19 09:32, 9F

01/19 09:40, , 10F
## 產生資料
01/19 09:40, 10F

01/19 09:41, , 11F
da <- matrix(0, 100, 8)
01/19 09:41, 11F

01/19 09:41, , 12F
## 每欄都是常態分配亂數
01/19 09:41, 12F

01/19 09:43, , 13F
for(i in 1:ncol(da)){da[, i]<-rnorm(nrow(da, 0, 1))}
01/19 09:43, 13F

01/19 09:44, , 14F
colnames(da) <- paste0('var', 1:ncol(da))
01/19 09:44, 14F

01/19 09:44, , 15F
## 要對每個欄做某些事情
01/19 09:44, 15F

01/19 09:45, , 16F
for( i in 1:ncol(da) ){
01/19 09:45, 16F

01/19 09:45, , 17F
do_something(da[, i])
01/19 09:45, 17F

01/19 09:45, , 18F
}
01/19 09:45, 18F

01/19 09:46, , 19F
## 沒有用到欄位名稱
01/19 09:46, 19F

01/19 09:47, , 20F
## 如果需要存下for迴圈內的資料
01/19 09:47, 20F

01/19 09:47, , 21F
l1 <- list()
01/19 09:47, 21F

01/19 09:47, , 22F
for( i in 1:ncol(da) ){
01/19 09:47, 22F

01/19 09:48, , 23F
l1[[i]] <- do_something(da[, i])
01/19 09:48, 23F

01/19 09:48, , 24F
}
01/19 09:48, 24F

01/19 09:48, , 25F
#########################
01/19 09:48, 25F

01/19 09:48, , 26F
#########################
01/19 09:48, 26F

01/19 09:50, , 27F
如果要用你原來的方式硬解問題,就會牽涉到NSE(
01/19 09:50, 27F

01/19 09:51, , 28F
Non-standard evaluation),學這個要花不少心力
01/19 09:51, 28F

01/19 09:51, , 29F
至少要搞懂變數和字串在r中的差別,配合assign
01/19 09:51, 29F

01/19 09:51, , 30F
eval和parse這些函式
01/19 09:51, 30F

01/19 09:52, , 31F
例如
01/19 09:52, 31F

01/19 09:53, , 32F
## 定義一個函式處理eval(parse(text='string'))
01/19 09:53, 32F

01/19 09:53, , 33F
EV <- function(x) { eval(parse(text=x)) }
01/19 09:53, 33F

01/19 09:53, , 34F
## 產生變數
01/19 09:53, 34F

01/19 09:54, , 35F
vars <- paste0('var', 1:8)
01/19 09:54, 35F

01/19 09:55, , 36F
for( i in 1:length(vars) ){
01/19 09:55, 36F

01/19 09:56, , 37F
assign(vars[i], anykindofdataInR)
01/19 09:56, 37F

01/19 09:56, , 38F
}
01/19 09:56, 38F

01/19 09:56, , 39F
## dosomething on vars
01/19 09:56, 39F

01/19 09:57, , 40F
for( i in 1:length(vars) ){
01/19 09:57, 40F

01/19 10:02, , 41F
do_something(EV(vars[i]))
01/19 10:02, 41F

01/19 10:02, , 42F
}
01/19 10:02, 42F

01/19 10:02, , 43F
##################
01/19 10:02, 43F

01/19 10:03, , 44F
只是上面這個方式很不像r就是了
01/19 10:03, 44F

01/19 11:53, , 45F
像樓上這樣寫法也有可能大幅降低運算效率。也容易犯錯。
01/19 11:53, 45F

01/19 11:53, , 46F
建議原po不要永久地考慮這種方式。換成R風格才容易長久
01/19 11:53, 46F

01/19 11:53, , 47F
使用下去。
01/19 11:53, 47F

01/19 11:56, , 48F
否則eval()個不停,會累死自己。
01/19 11:56, 48F

01/19 15:18, , 49F
本以為r 更有彈性一些 但好像思維差太多了 感謝推薦書籍
01/19 15:18, 49F

01/19 15:19, , 50F
最近有機會會詳讀 謝謝以上建議
01/19 15:19, 50F

01/19 15:21, , 51F
剛好學校資料庫有買這個電子書庫
01/19 15:21, 51F

01/19 18:33, , 52F
r 已經超級有彈性了...
01/19 18:33, 52F

01/19 22:50, , 53F
get() 好像不錯, 比邪惡的貼上短些
01/19 22:50, 53F

01/20 01:19, , 54F
既然要這樣寫loop, 就應該把a1 ~ a8 放到一個list中
01/20 01:19, 54F

01/20 01:20, , 55F
建議把list學會,然後學一下environment
01/20 01:20, 55F

01/20 01:20, , 56F
解這種問題就再也不用eval + parse硬幹了
01/20 01:20, 56F

01/20 13:31, , 57F
改變儲存資料的方式,才是活用R的方式。
01/20 13:31, 57F

01/20 13:32, , 58F
直接讀入資料為data. frame,不要事後用迴圈處理。
01/20 13:32, 58F

01/20 18:07, , 59F
list和 env大好
01/20 18:07, 59F
※ 編輯: celestialgod (36.233.51.224), 11/20/2016 14:57:44
文章代碼(AID): #1OCKZ1Vu (R_Language)
文章代碼(AID): #1OCKZ1Vu (R_Language)