如何在rgb(1,22,333)上使用separate_wider_regex,

kuuvgm7e  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(102)

我的代码没有给我给予期望值
| 列A|红色|绿色|蓝色|
| --|--|--|--|
| rgb(111,222,334)| 111 | 222 | 334 |
| RGB(11,22,3)| 11 | 22 | 3 |
A列分为3个新列

(df_data <- df3|>
     separate_wider_regex(
    cols = Column A,
    patterns = c(red = "rgb\\((\\d+),\\s*\\d+,\\s*\\d+\\)",
             green = "rgb\\(\\d+,\\s*(\\d+),\\s*\\d+\\)",
             blue = "rgb\\(\\d+,\\s*\\d+,\\s*(\\d+)\\)")

字符串
数据类型:

df_data <- data.frame(ColumnA = c("rgb(111,222,334)", "rgb(11,22,3)"))

u7up0aaq

u7up0aaq1#

separate_wider_regex()patterns vector应该形成匹配,但它可以包括命名和未命名的项目,只有命名的模式将在列中结束:

library(tidyr)

df_data <- data.frame(ColumnA = c("rgb(111,222,334)", "rgb(11,22,3)"))
df_data |> separate_wider_regex(ColumnA, 
                            patterns = c("^rgb\\(", 
                                         red   = "\\d+", ",", 
                                         green = "\\d+", ",", 
                                         blue  = "\\d+", "\\)$"))
#> # A tibble: 2 × 3
#>   red   green blue 
#>   <chr> <chr> <chr>
#> 1 111   222   334  
#> 2 11    22    3

字符串
创建于2023-11-07附带reprex v2.0.2

7kqas0il

7kqas0il2#

也许比使用正则表达式更简单的方法是首先使用dplyr::mutate删除rgb(),然后使用tidyr::separate_wider_delim

library(dplyr)
library(tidyr)

df_data %>% 
  mutate(ColumnA = gsub("rgb\\(|\\)", "", ColumnA)) %>%
  separate_wider_delim(ColumnA, 
                       names = c("Red","Green", "Blue"), 
                       delim = ",")

#   Red   Green Blue 
#   <chr> <chr> <chr>
# 1 111   222   334  
# 2 11    22    3

字符串

ldxq2e6h

ldxq2e6h3#

这里是一个基本的R解决方案,strsplit

df_data <- data.frame(ColumnA = c("rgb(111,222,334)", "rgb(11,22,3)"))

strsplit(df_data$ColumnA, "[[:alpha:]]+|\\(|\\)|,") |>
  lapply(\(x) {
    ok <- (x |> trimws() |> nchar()) > 0L
    x[ok] |> as.numeric()
  }) |>
  do.call(rbind.data.frame, args = _) |>
  setNames(c("Red", "Green", "Blue"))
#>   Red Green Blue
#> 1 111   222  334
#> 2  11    22    3

字符串
创建于2023-11-07附带reprex v2.0.2

s3fp2yjn

s3fp2yjn4#

一些替代的base-R方法:

strcapture("(\\d+),(\\d+),(\\d+)", df_data$ColumnA, list(Red=0L, Green=0L, Blue=0L)) |>
  cbind(df_data)
#   Red Green Blue          ColumnA
# 1 111   222  334 rgb(111,222,334)
# 2  11    22    3     rgb(11,22,3)
regmatches(df_data$ColumnA, gregexpr("[0-9]+", df_data$ColumnA)) |>
  do.call(rbind.data.frame, args = _) |>
  setNames(c("Red", "Green", "Blue")) |>
  cbind(df_data)
#   Red Green Blue          ColumnA
# 1 111   222  334 rgb(111,222,334)
# 2  11    22    3     rgb(11,22,3)
utugiqy6

utugiqy65#

另一种管基R方法

df_data <- data.frame(ColumnA = c("rgb(111,222,334)", "rgb(11,22,3)"))
strsplit(x = gsub(pattern = "rgb\\(|\\)", x = df_data$ColumnA, replacement = ""), split = ",") |>
  { \(x) data.frame(matrix(unlist(x), ncol = 3L, byrow = TRUE))}() |> 
  { \(x) cbind(df_data$ColumnA, x)}() |>
  `colnames<-`(c("ColumnA", "Red", "Green", "Blue"))
#>            ColumnA Red Green Blue
#> 1 rgb(111,222,334) 111   222  334
#> 2     rgb(11,22,3)  11    22    3

字符串
使用|> { \(x) ... }()
创建日期:2023年11月7日,使用reprex v2.0.2

相关问题