【问题标题】:add a new column based on grouping attributes根据分组属性添加新列
【发布时间】:2023-03-21 23:07:01
【问题描述】:

我想在 R 中添加一个新列,将我的子组汇总到组中。

这是我的例子:

id = c(1,2,2,3,4,4,4,5,5,5,6,6,6)
subgroup = c("lightred","lightblue","darkblue","lightred","darkred","darkred","lightblue","darkgreen","darkgreen","lightgreen","darkred","darkblue","lightgreen")
data = data.frame(cbind(id,subgroup))

> data
   id   subgroup
1   1   lightred
2   2  lightblue
3   2   darkblue
4   3   lightred
5   4    darkred
6   4    darkred
7   4  lightblue
8   5  darkgreen
9   5  darkgreen
10  5 lightgreen
11  6    darkred
12  6   darkblue
13  6 lightgreen

现在我想添加一个新列“颜色”,它将属性分组为 3 组“红色”、“绿色”和“蓝色”,无论它们是浅色还是深色。

最后应该是这样的:

   id   subgroup colour
1   1   lightred    red
2   2  lightblue   blue
3   2   darkblue   blue
4   3   lightred    red
5   4    darkred    red
6   4    darkred    red
7   4  lightblue   blue
8   5  darkgreen  green
9   5  darkgreen  green
10  5 lightgreen  green
11  6    darkred    red
12  6   darkblue   blue
13  6 lightgreen  green

【问题讨论】:

  • 如果子组不包含单词 red、blue 或 green,我该怎么办。例如,如果我也想将青色分组为蓝色?
  • 然后您可以相应地更新正则表达式以匹配每个组所需的模式。查看我更新的帖子。

标签: r


【解决方案1】:

我认为sub 应该可以在这里使用:

data$colour <- sub("^(?:light|dark)", "", data$subgroup)

Demo

【讨论】:

  • @RonakShah 我想这样做,但由于某种原因无法清楚地表达代码。
  • 如果子组不包含单词 red、blue 或 green,我该怎么办。例如,如果我也想将青色分组为蓝色?我可以定义一组属于一个组(=颜色)的属性,然后分配它们吗?例如蓝色 = 青色、浅蓝色、深蓝色、海洋、水、海军、天空、蓝绿色...
  • 这是一个不同的问题,会使已经给出的答案无效。您可能想问一个新问题。
【解决方案2】:

来自stringr

stringr::str_extract(data$subgroup,"red|green|blue")
 [1] "red"   "blue"  "blue"  "red"   "red"   "red"   "blue"  "green" "green" "green" "red"   "blue"  "green"



data$color=stringr::str_extract(data$subgroup,"red|green|blue")
data
   id   subgroup color
1   1   lightred   red
2   2  lightblue  blue
3   2   darkblue  blue
4   3   lightred   red
5   4    darkred   red
6   4    darkred   red
7   4  lightblue  blue
8   5  darkgreen green
9   5  darkgreen green
10  5 lightgreen green
11  6    darkred   red
12  6   darkblue  blue
13  6 lightgreen green

【讨论】:

    【解决方案3】:

    虽然这种方法不像其他方法那样流畅,但它非常灵活。我调整了操作的示例数据,以展示如何组合多个不遵循明/暗范式的组。

    编辑:

    更新帖子以回答 cmets 中操作员的问题。

    id = c(1,2,2,3,4,4,4,5,5,5,6,6,6)
    subgroup = c("lightred","lightblue","cyan","lightred","water","darkred","lightblue","darkgreen","darkgreen","lightgreen","darkred","darkblue","lightgreen")
    data = data.frame(cbind(id,subgroup))
    
    
    library(dplyr)
    data <- data %>% 
      dplyr::mutate(
        colour = dplyr::case_when(
          grepl("red"  , subgroup, fixed = TRUE) ~ "red",
          grepl("(blue)|(cyan)|(water)", subgroup, perl = TRUE) ~ "blue",
          grepl("green", subgroup, fixed = TRUE) ~ "green",
          TRUE ~ "else"
        )
      )
    data
    

    【讨论】:

    • 如果子组不包含单词 red、blue 或 green,我该怎么办。例如,如果我也想将青色分组为蓝色?我可以定义一组属于一个组(=颜色)的属性,然后分配它们吗?例如蓝色 = 青色、浅蓝色、深蓝色、海洋、水、海军、天空、蓝绿色...
    • @A_beginner 是的。您可以使用 () 和 |正则表达式中的 to 或语句。我相应地更新了我的帖子。
    猜你喜欢
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2014-01-08
    • 2021-10-16
    • 2019-04-17
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    相关资源
    最近更新 更多