使用列表对数据框进行子集以定义输入列
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 课程。以上是关于使用列表对数据框进行子集以定义输入列的主要内容,如果未能解决你的问题,请参考以下文章