我想知道如何使用subset
函數,如果我不知道我想測試的列的名稱。情景是這樣的:我有一個Shiny應用程序,用戶可以選擇一個變量來過濾(子集)數據表。我收到的列名在Web應用中輸入,我想根據該列的值集,像這樣:基於變量列名稱的子集
subset(myData, THECOLUMN == someValue)
除非雙方THECOLUMN
和someValue
是變量。是否有一個將所需列名作爲字符串傳遞的語法?
似乎想要一個只有列名的裸詞,而不是一個包含列名的變量。
我想知道如何使用subset
函數,如果我不知道我想測試的列的名稱。情景是這樣的:我有一個Shiny應用程序,用戶可以選擇一個變量來過濾(子集)數據表。我收到的列名在Web應用中輸入,我想根據該列的值集,像這樣:基於變量列名稱的子集
subset(myData, THECOLUMN == someValue)
除非雙方THECOLUMN
和someValue
是變量。是否有一個將所需列名作爲字符串傳遞的語法?
似乎想要一個只有列名的裸詞,而不是一個包含列名的變量。
這正是爲什麼subset
是不是交互使用其他任何不好的工具:
d <- data.frame(x = letters[1:5],y = runif(5))
> d[d[,'x'] == 'c',]
x y
3 c 0.3080524
從根本上說,R中提取的東西是圍繞[
建。用它。
subset
和with
都是爲交互使用而設計的,並且在其他功能中使用的警告將在其幫助頁面中找到。這源於他們的評估參數的策略,即作爲由其數據參數名稱構建的環境中的表達式。這些列/元素名稱否則不會是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
我想你可以使用下面的一行代碼:
myData[ , grep(someValue, colnames(myData))]
其中
colnames(myData)
輸出向量c ontaining所有列名和
grep(someValue, colnames(myData))
長度爲1的數字矢量應該結果(給出的列名是唯一的)指向你的專欄。有關R中模式匹配的信息,請參見?grep
。
這看起來像是做我想做的事,但我還沒有驗證它。如果我有問題,我會將其標記爲答案並跟進。 – adv12
冒着聽起來啞巴的風險,如果我使用data.table而不是data.frame,這是否會有所不同?它似乎。使用data.table,我可以使用「d [d [,theColumnName] =='c',]」,但我似乎無法使用「d [d,」theColumnName「] =='c 」,]」。 – adv12
@ adv12不,data.table的工作方式不同,(恕我直言)令人難以置信(對我的巨大和反覆的挫折)。我認爲data.table必須被鍵入以執行此操作:'setkey(d,「x」); d [ 「c」 的]'。但我總是找到數據。表格語法如此不透明以至於我通常會忽略「簡單」的方法。 – joran