27

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

subset(myData, THECOLUMN == someValue)

除非两者THECOLUMN都是someValue变量。是否有将所需列名作为字符串传递的语法?

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

4

3 回答 3

27

两者subsetwith都是为交互式使用而设计的,在其帮助页面中可以找到在其他功能中使用它们的警告。这源于他们将评估参数作为根据其数据参数名称构造的环境中的表达式的策略。否则,这些列/元素名称将不是 R 意义上的“对象”。

如果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
于 2013-06-12T21:51:23.557 回答
25

这正是为什么subset除了交互式使用之外,它是一个糟糕的工具:

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

从根本上说,在 R 中提取东西是围绕[. 用它。

于 2013-06-12T21:21:09.800 回答
4

我认为您可以使用以下单线:

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

在哪里

colnames(myData)

输出一个包含所有列名的向量和

grep(someValue, colnames(myData))

应该导致长度为 1 的数字向量(假设列名是唯一的)指向您的列。有关?grepR 中的模式匹配的信息,请参阅 。

于 2015-09-28T16:02:45.157 回答