首页 > 解决方案 > 在 group_by 之后使用列中的特定值减少数据帧

问题描述

我有以下 tidyverse 问题,用下面的 mpg 数据集表述为 reprex。

对于每个制造商的每个车型,我想知道是否有6缸版本可用。我可以很容易地生成一个six.cyl.available对这个属性进行编码的列。

library(tidyverse)
df <- mpg %>% mutate(six.cyl.available = if_else(cyl==6, "yes","no"))

reprex 包(v0.2.1)于 2018 年 10 月 11 日创建

现在,我想通过减少生成的数据帧group_by(manufacturer, model)并得到一个数据帧,其中原始帧的所有列都减去“cyl”。相反,我想要一个列six.cyl.available,如果此特定模型可用于 6 cyl,则包含“yes”,如果没有,则包含“no”。像这样:

|manufacturer |model     | displ| year|trans  |drv | cty| hwy|fl |class|six.cyl.available       |
|:------------|:-----------|:----------|---|
|audi         |a4        |   3.1| 2008|auto(av)   |f   |  18|  27|p  |compact    |yes|
|audi         |a4 quattro|   1.8| 1999|manual(m5) |4   |  18|  26|p  |compact    |no|

这个问题让我困惑了一段时间。我相信有一个简单的解决方案,我将不胜感激。

标签: rdplyr

解决方案


如果每组的所有其他列都具有相同的值,如果列有 6,我们可以给出“是”值anycyl那么我们为该组返回“是”,否则给出“否”,然后slice是该组中的任何一行(这里我有取第一行)并cyl从输出中删除该列。

library(dplyr)

df %>%
   group_by(manufacturer, model) %>%
   mutate(six.cyl.available = if (any(cyl==6)) "yes" else "no") %>%
   slice(1) %>%
   select(-cyl)

推荐阅读