如果我不知道要测试的列的名称,我想知道如何使用subset
函数。场景是这样的:我有一个Shiny应用程序,用户可以选择一个变量来过滤(子集)数据表。我从webapp接收列名称作为输入,我想根据该列的值进行子集化,如下所示:
subset(myData, THECOLUMN == someValue)
除THECOLUMN
和someValue
都是变量外。是否有将所需列名称作为字符串传递的语法?
似乎想要一个作为列名的裸字,而不是一个包含列名的变量。
答案 0 :(得分:24)
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
答案 1 :(得分:21)
这正是为什么subset
对于交互式使用以外的任何其他工具都是错误的工具:
d <- data.frame(x = letters[1:5],y = runif(5))
> d[d[,'x'] == 'c',]
x y
3 c 0.3080524
从根本上说,在R中提取内容是围绕[
构建的。使用它。
答案 2 :(得分:4)
我认为你可以使用以下单行:
myData[ , grep(someValue, colnames(myData))]
其中
colnames(myData)
输出包含所有列名和
的向量grep(someValue, colnames(myData))
应该生成一个长度为1的数字向量(给定列名称是唯一的)指向您的列。有关R中模式匹配的信息,请参阅?grep
。