基于变量列名的子集

Posted

技术标签:

【中文标题】基于变量列名的子集【英文标题】:Subset based on variable column name 【发布时间】:2013-06-09 03:46:46 【问题描述】:

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

subset(myData, THECOLUMN == someValue)

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

从根本上说,在 R 中提取内容是围绕 [ 构建的。使用它。

【讨论】:

这看起来像我想要的,但我还没有验证它。我会把它标记为答案,如果我有问题,我会跟进。 冒着听起来很愚蠢的风险,如果我使用的是data.table而不是data.frame,这会有所不同吗?它似乎。使用data.table,我可以使用“d[d[,theColumnName] == 'c',]”,但我似乎无法使用“d[d”theColumnName”] == 'c ',]"。 @adv12 不,data.tables 的工作方式不同,而且(恕我直言)令人难以置信的迟钝(令我非常沮丧)。我认为必须键入 data.table 才能执行此操作:setkey(d,"x"); d["c"]。但我总是发现 data.table 语法如此不透明,以至于我通常最终会忽略“更简单”的方法。【参考方案3】:

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

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

在哪里

colnames(myData)

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

grep(someValue, colnames(myData))

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

【讨论】:

以上是关于基于变量列名的子集的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历 R 中列名的特定子集

根据列名创建 DataFrame 的子集

基于宏变量的 SAS 子集

在 R 函数中为子集插入列名时遇到问题

基于因子变量的数据集子设置,该因子变量生成与因子长度一样多的子集

更改 R 中数据框列表中的列名子集