推 celestialgod: sapply(1:8, function(i)get(paste0("a". i))) 01/19 08:50
→ obarisk: 我覺得sas和r的程式思維差很多,要把sas的思維強制加到r 01/19 09:19
→ obarisk: 上,是有可能的,只是不確定有沒有人這樣做 01/19 09:19
→ obarisk: 也許你可以找那本書看看,或者從更基礎的r程式思維學起 01/19 09:20
→ obarisk: 否則學起來會很累 01/19 09:20
→ obarisk: 我試著用以下程式回答你的問題 01/19 09:28
→ obarisk: 如果你的資料可以化為2維的陣列,那data.frame是最簡單的 01/19 09:30
→ obarisk: 若是每筆資料都是data.frame,那就會用到list 01/19 09:32
→ obarisk: ## 產生資料 01/19 09:40
→ obarisk: da <- matrix(0, 100, 8) 01/19 09:41
→ obarisk: ## 每欄都是常態分配亂數 01/19 09:41
→ obarisk: for(i in 1:ncol(da)){da[, i]<-rnorm(nrow(da, 0, 1))} 01/19 09:43
→ obarisk: colnames(da) <- paste0('var', 1:ncol(da)) 01/19 09:44
→ obarisk: ## 要對每個欄做某些事情 01/19 09:44
→ obarisk: for( i in 1:ncol(da) ){ 01/19 09:45
→ obarisk: do_something(da[, i]) 01/19 09:45
→ obarisk: } 01/19 09:45
→ obarisk: ## 沒有用到欄位名稱 01/19 09:46
→ obarisk: ## 如果需要存下for迴圈內的資料 01/19 09:47
→ obarisk: l1 <- list() 01/19 09:47
→ obarisk: for( i in 1:ncol(da) ){ 01/19 09:47
→ obarisk: l1[[i]] <- do_something(da[, i]) 01/19 09:48
→ obarisk: } 01/19 09:48
→ obarisk: ######################### 01/19 09:48
→ obarisk: ######################### 01/19 09:48
→ obarisk: 如果要用你原來的方式硬解問題,就會牽涉到NSE( 01/19 09:50
→ obarisk: Non-standard evaluation),學這個要花不少心力 01/19 09:51
→ obarisk: 至少要搞懂變數和字串在r中的差別,配合assign 01/19 09:51
→ obarisk: eval和parse這些函式 01/19 09:51
→ obarisk: 例如 01/19 09:52
→ obarisk: ## 定義一個函式處理eval(parse(text='string')) 01/19 09:53
→ obarisk: EV <- function(x) { eval(parse(text=x)) } 01/19 09:53
→ obarisk: ## 產生變數 01/19 09:53
→ obarisk: vars <- paste0('var', 1:8) 01/19 09:54
→ obarisk: for( i in 1:length(vars) ){ 01/19 09:55
→ obarisk: assign(vars[i], anykindofdataInR) 01/19 09:56
→ obarisk: } 01/19 09:56
→ obarisk: ## dosomething on vars 01/19 09:56
→ obarisk: for( i in 1:length(vars) ){ 01/19 09:57
→ obarisk: do_something(EV(vars[i])) 01/19 10:02
→ obarisk: } 01/19 10:02
→ obarisk: ################## 01/19 10:02
→ obarisk: 只是上面這個方式很不像r就是了 01/19 10:03
推 andrew43: 像樓上這樣寫法也有可能大幅降低運算效率。也容易犯錯。 01/19 11:53
推 andrew43: 建議原po不要永久地考慮這種方式。換成R風格才容易長久 01/19 11:53
推 andrew43: 使用下去。 01/19 11:53
推 andrew43: 否則eval()個不停,會累死自己。 01/19 11:56
→ ******: 本以為r 更有彈性一些 但好像思維差太多了 感謝推薦書籍 01/19 15:18
→ ******: 最近有機會會詳讀 謝謝以上建議 01/19 15:19
→ ******: 剛好學校資料庫有買這個電子書庫 01/19 15:21
→ obarisk: r 已經超級有彈性了... 01/19 18:33
→ gsuper: get() 好像不錯, 比邪惡的貼上短些 01/19 22:50
→ Wush978: 既然要這樣寫loop, 就應該把a1 ~ a8 放到一個list中 01/20 01:19
→ Wush978: 建議把list學會,然後學一下environment 01/20 01:20
→ Wush978: 解這種問題就再也不用eval + parse硬幹了 01/20 01:20
推 celestialgod: 改變儲存資料的方式,才是活用R的方式。 01/20 13:31
→ celestialgod: 直接讀入資料為data. frame,不要事後用迴圈處理。 01/20 13:32
推 obarisk: list和 env大好 01/20 18:07
※ 編輯: celestialgod (36.233.51.224), 11/20/2016 14:57:44