regex 如何将特定子字符串解析为多列

xqkwcwgp  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(102)

我有一个由两列组成的数据框。产品名称和产品规格。
产品规格由一个长串连接组成,以逗号作为分隔符分隔。数据集是通过Web抓取产生的。
这是数据集的示例:

sample <- structure(list(Model = c("27GQ50F", "24GQ50F", "22MP41W", "22MP410"), 
Specs = c("Display: 27 in, VA, W-LED, 1920 x 1080 pixels",  
"Display: 23.8 in, VA, OLED, Viewing angles (H/V): 170  / 160", 
"Display: 21.5 in, VA, Edge LED (Local Dimming), 1920 x 1080 pixels, Viewing angles (H/V): 178  / 178", 
"Display: 21.5 in, Direct LED, 1920 x 1080 pixels, Viewing angles (H/V): 178  / 178, Brightness: 250 cd/m"
)), row.names = c(NA, 4L), class = "data.frame")

字符串

目标:我想从这个连接的字符串中创建一个包含产品名称和多列产品规格的整洁的数据框架。
挑战:串联字符串的值未根据规范类别对齐。缺少的规格值不使用NA填充,而是直接连接到下一个可用规格。

这意味着,如果我只是将连接的数据解析为多个列,那么许多值都在错误的列中。
我使用cSplit进行解析,这样就不需要定义结果列(可能因行而异,最多可以达到27个规范)。如你所见

#messy output by parsing
library(splitstackshape)
sample$Specs <- cSplit(sample, 'Specs', ',')

 Model          Specs_1    Specs_2                  Specs_3                          Specs_4
1: 27GQ50F   Display: 27 in         VA                    W-LED               1920 x 1080 pixels
2: 24GQ50F Display: 23.8 in         VA                     OLED Viewing angles (H/V): 170  / 160
3: 22MP41W Display: 21.5 in         VA Edge LED (Local Dimming)               1920 x 1080 pixels
4: 22MP410 Display: 21.5 in Direct LED       1920 x 1080 pixels Viewing angles (H/V): 178  / 178
                            Specs_5
1:                             <NA>
2:                             <NA>
3: Viewing angles (H/V): 178  / 178
4:             Brightness: 250 cd/m


而一个干净的应该是这样的

Model          Specs_1    Specs_2                  Specs_3                          Specs_4
1: 27GQ50F   Display: 27 in         VA                    W-LED               1920 x 1080 pixels
2: 24GQ50F Display: 23.8 in         VA                     OLED                             <NA>
3: 22MP41W Display: 21.5 in         VA  Edge LED (Local Dimming)              1920 x 1080 pixels
4: 22MP410 Display: 21.5 in        <NA>              Direct LED               1920 x 1080 pixels 
                            Specs_5                  Specs_6
1:                             <NA>                       <NA>
2: Viewing angles (H/V): 170  / 160                       <NA>
3: Viewing angles (H/V): 178  / 178                       <NA>
4: Viewing angles (H/V): 178  / 178            Brightness: 250 cd/m


我都不知道该从何开始。
但每种规格都有一个已知的模式。对于规范3,存在包含单词“LED”的子串。对于规格4,以像素结束。其他均为“规格名称:值’。

**Edited:**按照建议,我使用mutate,str_extract和regex将每个规范提取到其列中。一些示例:

sample %>% mutate(Display = str_extract(Specs, "Display:\\s*[0-9.]+\\s*in"),
                    `LCD Panel` = str_extract(Specs, "VA|IPS"),
                    `Refresh rate` = str_extract(Specs,                                 
                     "\\d+\\sHz\\s\\-\\s\\d+\\sHz"),
                     Resolution = str_extract(Specs, 
                     "\\d+\\sx\\s\\d+\\spixels"))


对于每一列如此类推。
唯一一个我不知道如何提取的是第三个规范。我不知道有多少可能的变化,但都包含在它的LED。
示例模式是“W-LED”、“OLED”、“Edge LED(局部调光)”、“Direct LED”,我想提取分隔符之间的所有子串。
这意味着正则表达式应该能够提取“边缘LED(局部调光)”,而不仅仅是“边缘LED”等。

ddarikpa

ddarikpa1#

library(tidyverse)

display_types <- c("OLED", "Direct LED", "W-LED", "Edge LED")

sample %>% 
  mutate(DisplaySize = as.numeric(str_extract(Specs, "\\d+(\\.\\d+)?(?= in)")), 
        `Viewing Angles` = str_extract(Specs, "(?<=Viewing angles \\(H/V\\): ).*"), 
        Resolution = str_extract(Specs, "\\d{3,4} x \\d{3,4}"), 
        `Display Type` = str_extract(Specs, paste(display_types, collapse = "|")), 
        Brightness = as.numeric(str_extract(Specs, "(?<=Brightness: )\\d+(?= cd/m)")))

# A tibble: 4 × 7
  Model  Specs DisplaySize `Viewing Angles` Resolution `Display Type` Brightness
  <chr>  <chr>       <dbl> <chr>            <chr>      <chr>               <dbl>
1 27GQ5… Disp…        27   NA               1920 x 10… W-LED                  NA
2 24GQ5… Disp…        23.8 170  / 160       NA         OLED                   NA
3 22MP4… Disp…        21.5 178  / 178       1920 x 10… Edge LED               NA
4 22MP4… Disp…        21.5 178  / 178, Bri… 1920 x 10… Direct LED            250

字符串

相关问题