2015-11-29 53 views
0

我正在嘗試創建一個繪製整個數據集或數據子集的圖形的函數。該功能需要能夠執行兩項操作,以便您可以根據需要繪製子集。我正在努力想出一個通用的子集函數。在R中設置數據作爲通用函數

我現在有這樣的代碼(我更多的SAS用戶因此R困惑我一個位):

subset<-function(dat, varname, val) 
if(dat$varname==val) { 
    data<-subset(dat, dat$varname==val) 
} 

可是者繼續返回此錯誤消息:

錯誤,如果(dat $ varname == val){:參數長度爲零

有人可以幫我解決這個問題嗎?非常感謝!我想這可能與我寫的方式有關。

+1

請提供完整的代碼,包括生成錯誤並且所有的輸入,使任何人都可以複製自己的機器上的問題的測試代碼。 –

回答

2

首先關閉所有的$操作符不能處理變量。在你的代碼中,你總是查找一個名爲varname的列。 改爲$varname而不是[varname]。 接下來的錯誤是,你是一個矢量調理,dat$varname==val將是布爾值的矢量。 代碼中的第三個錯誤是您命名了您的函數子集,因此覆蓋了基本包中的子集函數。所以子集的內部調用將是對你自己函數的遞歸調用。要修復這個重命名你的功能,或者你必須指定它是你用base::subset(dat, dat[varname]==val)調用的基本包中的子集函數。 代碼中的最後一個錯誤是你的函數沒有返回任何東西。不要將結果分配給變量數據,而是將其返回。

下面是代碼的樣子。

mySubset<-function(dat, varname, val) 
if(any(dat[varname]==val)) { 
    subset(dat, dat[varname]==val) 
} else { 
    NA 
} 

甚至更​​好

mySubset <- function(dat,varname,val) dat[dat[varname] == val] 
+0

非常感謝您的回覆。我在代碼中意識到了dat $ varname的問題,但是當我按照你指定的方式輸入它時,它說變量沒有找到。所以,它仍然沒有讀取它作爲dat $ varname – Alex

+0

哦,我也忘記了我想要返回的是作爲我們正在使用的新數據集的子集數據的分配。因此,數據<-subset(dat,dat [varname] == val) – Alex

+0

首先,varname應該是一個字符串,所以如果你的列被調用x,你必須調用帶有「x」而不是x的函數。在函數使用數據<-mySubset(data,varname,val)之外進行賦值要好得多, – nist