【问题标题】:Create a new categorical column based on conditions of values in other columns in a dataframe in R根据R中数据框中其他列中值的条件创建一个新的分类列
【发布时间】:2020-02-27 14:16:00
【问题描述】:

虽然它似乎以前已经解决了in other questions,但我的问题更具挑战性。

让我们从我从 Calc 表中复制/粘贴的示例开始:

这是所需的最小可重现示例:

Label <- c("Catalog codes:" , "Themes:", "Size:", "Score:", "Buy Now:",
           "Series:", "Catalog codes:", "Themes:", "Related items:", "Buy Now:",
           "Catalog codes:", "Themes:", "Size:", "Score:",
           "Series:", "Themes:", "Size:", "Score:", "Related items:",
           "Catalog codes:", "Themes", "Size:", "Score:", "Related items:", "Buy Now:")
example <- as.data.frame(Label)

我拥有的 R 数据框的一部分包含一列,该列具有该列 (Label) 和许多行。

这里的重点是一组行属于一个类别(比如Group 1 等等)。您可以在上一张图片中以粉红色和白色背景识别不同的组。

虽然每个组中的标签都有内部顺序,但并非所有组都包含相同的标签。

但是,每个组中的开始和结束标签保持不变,具体取决于存在的标签。您可以看到Catalog codes: 和Series: 开始每个组,而Buy Now:、Score: 和Related items: 结束每个组。

我想在此数据框中创建第二列,它可以识别这些结束/开始标签的模式或组合,然后对它们进行分类。结果可能类似于此图像:

【问题讨论】:

  • 请不要为数据或代码嵌入图片,而是使用缩进的代码块。此外,如果您提供minimale reproducible example,则可以更轻松地为您提供帮助
  • 我添加了数据框示例的代码@dario
  • 您说Catatolg codes 和Series 都开始了一个新组...但是在您的示例输出中,第 6 行(系列)第 7 行(目录代码)在同一个组中...为什么?
  • @Wimpel,因为我提到并非所有标签都存在于一个组中。在您引用的示例中,第 2 组有两个标签,但其他没有。当 Series: is, present, Series: 是第一个标签。不存在时,第一个是下一个,即Catalog codes:

标签: r dataframe conditional-statements categorical-data


【解决方案1】:

如果您使用grepl() 搜索开始标签和结束标签,您可以将结束标签移动一行并查看开始和结束标签匹配的位置,并使用它来创建带有cumsum() 的组ID。这可确保您始终将组的第一个起始标签和组的最后一个结束标签之间的所有内容组合在一起,因为一个组中可以有多个标签。

Label <- c("Catalog codes:" , "Themes:", "Size:", "Score:", "Buy Now:",
           "Series:", "Catalog codes:", "Themes:", "Related items:", "Buy Now:",
           "Catalog codes:", "Themes:", "Size:", "Score:",
           "Series:", "Themes:", "Size:", "Score:", "Related items:",
           "Catalog codes:", "Themes", "Size:", "Score:", "Related items:", "Buy Now:")
example <- as.data.frame(Label)


example$Group <- paste("Group", 
                       cumsum(
                         grepl("Catalog codes:|Series:", example$Label) * c(TRUE, head(grepl("Buy Now:|Score:|Related items:", example$Label), -1))
                       )
)

# Result
            Label   Group
1  Catalog codes: Group 1
2         Themes: Group 1
3           Size: Group 1
4          Score: Group 1
5        Buy Now: Group 1
6         Series: Group 2
7  Catalog codes: Group 2
8         Themes: Group 2
9  Related items: Group 2
10       Buy Now: Group 2
11 Catalog codes: Group 3
12        Themes: Group 3
13          Size: Group 3
14         Score: Group 3
15        Series: Group 4
16        Themes: Group 4
17          Size: Group 4
18         Score: Group 4
19 Related items: Group 4
20 Catalog codes: Group 5
21         Themes Group 5
22          Size: Group 5
23         Score: Group 5
24 Related items: Group 5
25       Buy Now: Group 5

【讨论】:

    【解决方案2】:

    此答案与您想要的输出不完全匹配...请参阅下面的输出... 请澄清为什么第 6 行没有它的“自己的”组,如 cmets 中所要求的那样。

    library( data.table )
    setDT(example)[, Group := paste0( "Group ", 
                                      cumsum( grepl( "^Catalog codes|^Series", Label ) ) 
                                      ) ]
    #              Label   Group
    #  1: Catalog codes: Group 1
    #  2:        Themes: Group 1
    #  3:          Size: Group 1
    #  4:         Score: Group 1
    #  5:       Buy Now: Group 1
    #  6:        Series: Group 2   <-- !!
    #  7: Catalog codes: Group 3   <-- !!
    #  8:        Themes: Group 3
    #  9: Related items: Group 3
    # 10:       Buy Now: Group 3
    # 11: Catalog codes: Group 4
    # 12:        Themes: Group 4
    # 13:          Size: Group 4
    # 14:         Score: Group 4
    # 15:        Series: Group 5
    # 16:        Themes: Group 5
    # 17:          Size: Group 5
    # 18:         Score: Group 5
    # 19: Related items: Group 5
    # 20: Catalog codes: Group 6
    # 21:         Themes Group 6
    # 22:          Size: Group 6
    # 23:         Score: Group 6
    # 24: Related items: Group 6
    # 25:       Buy Now: Group 6
    # Label   Group
    

    【讨论】:

    • 我在cmets中回答了问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多