2016-01-28 63 views
0

我一直在考慮一個腳本來擴展和已經我看到這種模式有很多:摘要一個子集模式

newdf <- df[ which(df$someCol %in% c(values...)), ] 

令人費解了一段時間我想通了之後,它基於子集對數據集列中存在值。爲了使代碼更易於閱讀,我想將它抽象爲一個函數。像這樣:

subset_column.vals <- function(x, col, selectors) { 
    return(x[which(x$col %in% selectors),]) 
} 

但該函數總是返回一個0行的數據幀。即使在函數之外具有相同輸入的表達式返回預期結果時也是如此。任何人都知道發生了什麼問題?

+2

這樣的函數存在:'dplyr :: filter(col%in%selectors)'例如。另外,在選擇器後缺少',]' – scoa

+1

不要在變量/函數名稱中使用'.'!從早期的R和S3方法查找混亂中,這是一個可怕的慣例。相反,建議在任何地方始終使用'_'。 –

+0

感謝提示@KonradRudolph!我已經將這些內容貫穿了我繼承的腳本。寫這個的人也是一個新手。 – JoeM05

回答

1

已經有相當高效的功能。例如:

  • 使用dplyrdplyr::filter(x,col %in% selectors)在基地-R
  • subset(x,col %in% selectors)

如果我們真的想要寫一個又一個,這會工作:

subset_column_vals <- function(x, col, selectors) { 
    return(x[x[,col] %in% selectors,]) 
} 

subset_column_vals(iris,"Species",c("setosa")) 

注意我們使用[而不是$來子集數據幀,因爲$做與引用的論據不一致。