子集基于变量列名

时间:2013-06-12 21:17:44

标签: r shiny subset

如果我不知道要测试的列的名称,我想知道如何使用subset函数。场景是这样的:我有一个Shiny应用程序,用户可以选择一个变量来过滤(子集)数据表。我从webapp接收列名称作为输入,我想根据该列的值进行子集化,如下所示:

subset(myData, THECOLUMN == someValue)

THECOLUMNsomeValue都是变量外。是否有将所需列名称作为字符串传递的语法?

似乎想要一个作为列名的裸字,而不是一个包含列名的变量。

3 个答案:

答案 0 :(得分:24)

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

答案 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