使用列表对数据框进行子集以定义输入列

Posted

技术标签:

【中文标题】使用列表对数据框进行子集以定义输入列【英文标题】:Subset a dataframe using a list to define the input column 【发布时间】:2022-01-23 05:21:38 【问题描述】:

我有一个大型数据框矩阵,我想运行多个绘图和摘要,其中一个变量名称是通过列表输入的。

示例: 我有一个名为 Species 的数据框:

ID  Spp1    Spp2    Spp3    Spp4
M   Null    827     647     331
M   721     3974    Null    143
F   1737    494     96      276
M   Null    9304    Null    7435
F   Null    Null    Null    Null
F   262     331     158     1223
F   293     771     647     3101

我想要一个通过列表过滤列的数据框:

ID  Spp1    Spp2    Spp3    Spp4
M   721     3974    Null    143
F   1737    494     96      276
F   262     331     158     1223
F   293     771     647     3101

在下面的示例中,我想根据 in.List 在 for 循环中对我的表进行子集化,以提供选择字段 inSpp。我已经尝试构建一个表达式 1st 并剥离 ", 过滤器以从感兴趣的字段中提取 NA。我尝试过的任何方法都不允许我将变量设置为子集或箱线图线的输入。如何使用变量作为输入?

目标是 plotSpecies = 1) = plotSpecies = 1)

in.List <- c(“Spp1”, “Spp2”, “Spp3”, “Spp4”)

for(inSpp in in.List)

    plotSpecies <- subset(Species, inSpp >= 1) 
    boxplot(inSpp~ID, data=plotSpecies, id.method="y", do.conf=TRUE, notch=TRUE, top=TRUE, main=inSpp)


【问题讨论】:

我很困惑。您首先描述了从 7 行到 4 行的总结,但您没有谈论所需的聚合或缩减步骤。然后您询问是否绘制每一列(如in.List 中所定义),它甚至不使用这些新数据(数据也不是真的足够大以证明箱线图的合理性)。你能澄清一下吗? 我对你的问题感到困惑。我不问用 7 行总结数据框,我的问题是当子集语句的一部分是从列表中分配的变量时,如何对数据框进行子集化。 好吧,我想我明白了……你的第二帧不是缩小,它是你的第二个列表。我读错了,对不起。 【参考方案1】:

问题是for 循环中的两个函数subset()boxplot() 都使用“非标准评估”,因此需要不带引号的变量名。但在循环中,inSpp 变量的计算结果为字符串。您可以使用以下两种方法之一来解决此问题,使用[[ 或将inSpp 替换为eval(as.name(inSpp)),如下所示:

for (inSpp in in.List) 
  plotSpecies <- subset(Species, Species[[inSpp]] >= 1) 
  boxplot(plotSpecies[[inSpp]] ~ plotSpecies$ID, 
          id.method = "y", do.conf = TRUE, notch = TRUE, top = TRUE, 
          main = inSpp)


for (inSpp in in.List) 
  plotSpecies <- subset(Species, eval(as.name(inSpp)) >= 1) 
  boxplot(eval(as.name(inSpp)) ~ ID, data = plotSpecies,
          id.method = "y", do.conf = TRUE, notch = TRUE, top = TRUE, 
          main = inSpp)


【讨论】:

阿伦,非常感谢。这正是我所追求的。我知道如何在 Python 中做到这一点,但 R 中的语法和结构对我来说仍然是一条学习曲线。真的应该在某个时候参加 R 课程。

以上是关于使用列表对数据框进行子集以定义输入列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用列名对数据框列进行子集化? [复制]

如何根据应用于大量列的“不等于”标准对数据框进行子集化?

对多个数据框进行子集化并聚合它们以有效地进行绘图

如何使用“OR”组合多个条件以对数据框进行子集化?

如何通过列名的前缀对火花数据框进行子集化?

根据列中的条件对数据框中的行进行子集/过滤