【问题标题】:Subsetting a dataframe in R by conditions for each column using a variable使用变量为每列的条件对 R 中的数据框进行子集化
【发布时间】:2016-04-13 16:00:02
【问题描述】:

我在 R 中有一个数据框(我们称之为“动物”),其中的列以兔子、猫等动物命名。它看起来像这样:

| Rabbit | Cat | Frog | Cow | Dog |
|--------|-----|------|-----|-----|
| 0      | 1   | 1    | 0   | 1   |
| 0      | 0   | 3    | 1   | 4   |
| 2      | 1   | 0    | 0   | 0   |

列表有数百行,动物(列)也更多。

我想为每个数量大于 0 的动物获取此数据帧的子集。例如,我想要一个子集的 Rabbits 数据帧,其中仅包含 Animals 中 Rabbit > 0 的行。

首先我尝试创建一个变量“物种”:

species <- "Rabbit"

然后,我尝试使用 dplyr 的 filter() 对 Animals 数据框进行子集化:

Rabbits <- filter(Animals, species >= 1)

这不起作用,因为 filter() 试图查找名为“species”而不是“Rabbit”的列。

我创建了“物种”变量,因为我希望通过循环遍历我所有动物名称的向量并将它们子集到相应的数据帧中来自动化该过程。

有没有更有效的方法来解决这个问题?

我对 R 非常陌生,因此任何 ELI5 解释都将不胜感激。谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以使用[] 语法按名称访问列。

    toKeep <- Alimals[species] >= 1
    

    然后

    Rabbit <- Animals[toKeep,]
    

    【讨论】:

    • 感谢您的快速回答!这接近我想要的,但问题是我想在 Rabbit>=1 中使用变量代替 Rabbit。 IE。我想要物种>=1,其中物种
    • 另一种解决方案是使用 reshape2 包来转换您的数据,这样您就只有两列:一列是动物(兔子、猫等),另一列是动物的数量.
    • 我还要注意,以编程方式将最终数据框命名为“Rabbit”,我使用了 assign(species, Animals[toKeep,])
    【解决方案2】:

    这是一种通过传入的列创建每个子集的 data.frames 列表的方法:

    datasets <- lapply(colnames(mtcars), function(v) subset(mtcars, mtcars[,v] > 0))
    

    只需将colnames(mtcars) 更改为您的物种变量,并将mtcars 更改为您的data.frame。

    【讨论】:

    • 谢谢你。老实说,我仍然对 apply 系列函数感到非常紧张,我永远无法弄清楚该使用哪个或如何使用。需要在这方面做更多的工作。
    • 值得学习!它们是使用和试验的安全功能。 lapply 在列表(data.frames 是)上效果很好。我认为这是一种比使用assign 更安全的方法。
    • 谢谢@Zelazny7!我会去找一些关于这些函数的优秀 ELI5 介绍,也许会尝试找到一些带有练习的教程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2011-11-26
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多