2013-06-12 167 views
21

我想知道如何使用subset函數,如果我不知道我想測試的列的名稱。情景是這樣的:我有一個Shiny應用程序,用戶可以選擇一個變量來過濾(子集)數據表。我收到的列名在Web應用中輸入,我想根據該列的值集,像這樣:基於變量列名稱的子集

subset(myData, THECOLUMN == someValue) 

除非雙方THECOLUMNsomeValue是變量。是否有一個將所需列名作爲字符串傳遞的語法?

似乎想要一個只有列名的裸詞,而不是一個包含列名的變量。

回答

20

這正是爲什麼subset是不是交互使用其他任何不好的工具:

d <- data.frame(x = letters[1:5],y = runif(5)) 
> d[d[,'x'] == 'c',] 
    x   y 
3 c 0.3080524 

從根本上說,R中提取的東西是圍繞[建。用它。

+0

這看起來像是做我想做的事,但我還沒有驗證它。如果我有問題,我會將其標記爲答案並跟進。 – adv12

+0

冒着聽起來啞巴的風險,如果我使用data.table而不是data.frame,這是否會有所不同?它似乎。使用data.table,我可以使用「d [d [,theColumnName] =='c',]」,但我似乎無法使用「d [d,」theColumnName「] =='c 」,]」。 – adv12

+0

@ adv12不,data.table的工作方式不同,(恕我直言)令人難以置信(對我的巨大和反覆的挫折)。我認爲data.table必須被鍵入以執行此操作:'setkey(d,「x」); d [ 「c」 的]'。但我總是找到數據。表格語法如此不透明以至於我通常會忽略「簡單」的方法。 – joran

21

subsetwith都是爲交互使用而設計的,並且在其他功能中使用的警告將在其幫助頁面中找到。這源於他們的評估參數的策略,即作爲由其數據參數名稱構建的環境中的表達式。這些列/元素名稱否則不會是R-sense中的「對象」。

如果THECOLUMN是一個對象,它的值是列的名稱和someValue是一個對象,其值是目標的名稱的名稱,那麼你應該使用:

dfrm[ dfrm[[THECOLUMN]] == someValue , ] 

事實上,「 [[「將評估它的論點是爲什麼它優於編程的」$「。如果我們使用joran的例子:

d <- data.frame(x = letters[1:5],y = runif(5)) 
THECOLUMN= "x" 
someValue= "c" 

d[ d[[THECOLUMN]] == someValue , ] 
# x   y 
# 3 c 0.7556127 
在這種情況下

因此,所有這些返回相同的原子向量:

d[[ THECOLUMN ]] 
d[[ 'x' ]] 
d[ , 'x' ] 
d[, THECOLUMN ] 
d$x # of the three extraction functions: `$`, `[[`, and `[`, 
    # only `$` is unable to evaluate its argument 
3

我想你可以使用下面的一行代碼:

myData[ , grep(someValue, colnames(myData))] 

其中

colnames(myData) 

輸出向量c ontaining所有列名和

grep(someValue, colnames(myData)) 

長度爲1的數字矢量應該結果(給出的列名是唯一的)指向你的專欄。有關R中模式匹配的信息,請參見?grep