【问题标题】:Group dataframe by multiple variables in R通过 R 中的多个变量对数据框进行分组
【发布时间】:2015-10-06 18:08:48
【问题描述】:

我有一个包含 5713 行和 7 列的数据框。许多行是重复的。我需要按“性别”和“大小”创建 5 个组,同时确保“项目”列不包含重复项,并且“类型”列最多只包含 1 个“羊毛”。我尝试过 sample、split、group_by、sample_n,但似乎无法弄清楚如何包含所有变量。

这是数据框的示例:

                  SKU          UPC   type rating size gender  item
1  M3MEN-SU15-BLU-XXL 628012010215    Tee      5  XXL      M M3MEN
2  M3MEN-SU15-GRY-XXL 628012010314    Tee      5  XXL      M M3MEN
3   M3MEN-SU15-GRY-XL 628012010316   Tank      5   XL      M M3MEN
4          MAMA-CHA-S *MAMA-CHA-S*   Tank      5    S      M  MAMA
5          MAMA-CHA-S *MAMA-CHA-S*    Tee      5    S      M  MAMA
6          MBAN-CHA-M *MBAN-CHA-M* Fleece      3    M      W  MBAN
7          WAZA-CHA-L *WAZA-CHA-L* Fleece      3    L      M  WAZA
8          MBAN-CHA-M *MBAN-CHA-M* Fleece      3    M      W  MBAN
9          MBAN-CHA-M *MBAN-CHA-M* Fleece      3    M      M  MBAN
10         MCON-CHA-M *MCON-CHA-M* Fleece      3    M      M  MCON  

理想情况下,我想创建一个新列,为每组 5 个创建一个唯一 ID。

例如:

                  SKU          UPC   type rating size gender  item  id
1    M3MEN-SU15-BLU-S 628012010215    Tee      5    S      M M3MEN   1
2          MAMA-CHA-S *MAMA-CHA-S*   Tank      5    S      M  MAMA   1
3          MBAN-CHA-S *MBAN-CHA-S*   Tank      3    S      M  MBAN   1
4          MAZA-CHA-S *MAZA-CHA-S*    Tee      3    S      M  MAZA   1
5          MCON-CHA-S *MCON-CHA-S* Fleece      3    S      M  MCON   1  
6    W3MEN-SU15-BLU-M 428012010215    Tee      2    M      W W3WOM   2
7          WAMA-CHA-M *WAMA-CHA-M*   Tank      4    M      W  MAMA   2
8          WBAN-CHA-M *WBAN-CHA-M*   Tank      5    M      W  MBAN   2
9          WAZA-CHA-M *WAZA-CHA-M*    Tee      1    M      W  MAZA   2
10         WCON-CHA-M *WCON-CHA-M* Fleece      3    M      W  MCON   2  

我已经为此苦苦挣扎了一段时间。任何帮助将不胜感激!

【问题讨论】:

  • 你能展示你试过的代码吗?这将有助于了解您正在尝试做的事情。在dput(head(yourdata, 20)) 中包含一个可重现的示例也会有所帮助。
  • 我尝试创建组样本(按性别和大小),但它不能解决包含超过 1 个羊毛实例的唯一“项目”或“类型”的问题。 df <- df %>% group_by(gender, size) %>% sample_n(size = 5)
  • 当你说 >need to create groups of 5 by "gender" 和 "size" 你说 5 有什么特别的原因,而不是仅仅说我需要创建相同性别的组 - 和-size 例如男性,首先是小。然后显示男性,中。然后显示男性,大。然后显示女性、小号等。只是想知道这 5 是否是某种额外的要求,或者只是你注意到的东西,据你所知,每个性别 + 尺寸组只能有 5 种变化。
  • @user454038 我需要 5 个组,因为我正在尝试创建 5 个项目的产品包。捆绑中的每个项目都需要不同。

标签: r split dplyr sample


【解决方案1】:

使用distinct 函数可以很简单地避免组内item 的重复:

library(dplyr)
df %>%
  group_by(gender, size) %>%
  distinct(item)

确保不超过一个“羊毛”有点棘手,但可以使用filter 和cumsum。这会删除除第一个 Fleece 之外的所有内容(每个组内)。

  filter(!(type == "Fleece" & cumsum(type == "Fleece") > 1))

然后你可以像你最初尝试的那样做sample_n:

  sample_n(5)

总的来说,您的代码是:

df <- df %>%
  group_by(gender, size) %>%
  distinct(item) %>%
  filter(cumsum(type == "Fleece") <= 1) %>%
  sample_n(5)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多