看板 R_Language 關於我們 聯絡資訊
[問題類型]: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) [軟體熟悉度]: 入門(寫過其他程式,只是對語法不熟悉) [問題敘述]: 以 subsetBy 為例好了 (這是doBy package 的一個function) 這個 function 可以依照組別來篩選 data frame 的資料。 假設我想要寫一個 function 會用到 subsetBy 這個 function 的功能是依組別去除 2 倍 SD 之外的資料 問題如下: subsetBy 的第二個參數是要輸入一個 expression (應該是吧) 如 subsetBy(~Evit, Weight < mean(Weight), data=dietox) 這個 expression 是篩選資料的算式,其中的變數會對應到 data frame 的 column name 而我想要寫一個 function 是 sdSubsetFun = function(group, dVar, data) data 是我要操作的 data frame dVar 是要去掉的 2SD 的目標 column name group 是分組的依據 (class 是 formula) 但是我沒辦法將 dVar 傳進去裏面的 subsetBy 的第二個參數 程式碼如下 ###################################################################### library('doBy') sdSubsetFun = function(group, dVar, data) { sdVar = substitute(dVar) # 2SD threshold subsetThreshold = substitute( (sdVar > (mean(sdVar) - 2*sd(sdVar))) & (sdVar < (mean(sdVar) + 2*sd(sdVar))) ) dataOut = subsetBy(group, subset = eval(subsetThreshold, group, parent.frame()), data = data) } # Create Data aa = rep(c('a','b','c'), 50) bb = 1:150 tData = data.frame(aa,bb) subData = sdSubsetFun(~aa, bb, tData) ###################################################################### 錯誤訊息為: > subData = sdSubsetFun(~aa, bb, tData) Error in eval(subsetThreshold, group, parent.frame()) : object 'subsetThreshold' not found 也就是說,裏面的 subsetBy 都不會抓我的 subsetThreshold 的值, 都還是會抓 subsetThreshold 自己本身的 expression。 要怎麼做才會讓他抓到 subsetThreshold 的值呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 139.184.222.136
Wush978:我是直接先把eval(subsetThreshold,...)的結果assign給 06/01 09:21
Wush978:data$temp 之類的變數,然後再丟到subsetBy 06/01 09:22
cog5566:謝謝回應。有點不太懂,這樣不會 subsetBy 也去抓變數名 06/01 16:23
cog5566:嗎?如果可以,可以貼上成功運作的 code 嗎 06/01 16:24
※ 編輯: cog5566 來自: 139.184.222.89 (06/01 18:02)
clickhere:parse(text=paste(sdVar, ">1")) 06/01 19:24
cog5566:不行也,會發生同樣的問題 06/02 06:19
cog5566:Error in paste(sdVar, ">1") : object 'sdVar' not found 06/02 06:19
Chris7462:他的第二個參數要輸入的是 logical 不是 expression 06/02 10:05
Chris7462:你用他的 example 看一下 06/02 10:05
Chris7462:> data(dietox) 06/02 10:05
Chris7462:> typeof(dietox$Weight < mean(dietox$Weight)) 06/02 10:06
cog5566:我想不是 logical 06/02 11:10
Chris7462:你試就知道了,上面寫得很清楚是 logical indicator 06/02 11:47
Chris7462:不要用想的,請去看他的 example 好嗎 06/02 11:55
clickhere:sdVar是字串 如 "bb", paste 不收 expression. 06/03 10:00