Сложное разбиение строки на столбцы в R - PullRequest
0 голосов
/ 06 октября 2018

Я работаю с очень запутанным набором данных, в котором есть столбец, который нужно разбить на еще несколько столбцов на основе стандартного разделителя ",|".

Вот как выглядят записи в указанном столбце:

Color:Red,|Texture:Rough,|Shape:Circular,|ID:1323,|Location:Canada,|Video-Status:Yes

Основная проблема, с которой я столкнулся, заключается в том, что не все дескрипторы, которые нужно разделить, отображаются в одном и том же порядке.Иногда цвет первый, а иногда последний.Кроме того, некоторые показатели не отображаются, например, «Статус видео» не в каждой строке.

Как лучше всего создать 6 новых столбцов из предоставленных мной данных?Я тут почесал голову ...

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Я бы сделал это, используя различные функции tidyr.Я создал несколько примеров данных с записями, которые меняются местами и пропускаются.

library(tidyverse)
df %>%
    rowid_to_column("row") %>%
    separate_rows(V1, sep = "\\|") %>%
    mutate(V1 = str_replace(V1, ",$", "")) %>%
    separate(V1, c("key", "value"), sep = ":") %>%
    spread(key, value, fill = NA)
#  row Color   ID Location    Shape Texture Video-Status
#1   1   Red 1323   Canada Circular   Rough          Yes
#2   2   Red 1323   Canada Circular   Rough          Yes
#3   3   Red 1323   Canada Circular   Rough         <NA>

Объяснение: Сначала мы разделяем записи на разные строки, разделяя записи на "|", удаляя конечные значения ",", разделяя записи на разные столбцы с помощьюразделение записей на ":" и, наконец, изменение формы с длинного на широкое для получения ожидаемого результата.


Пример данных

df <- read.table(text =
    "Color:Red,|Texture:Rough,|Shape:Circular,|ID:1323,|Location:Canada,|Video-Status:Yes
    Texture:Rough,|Color:Red,|Shape:Circular,|ID:1323,|Location:Canada,|Video-Status:Yes
    Texture:Rough,|Color:Red,|Shape:Circular,|ID:1323,|Location:Canada")
0 голосов
/ 06 октября 2018

Существует скрытая функция R, read.dcf, которая может работать с данными пары Name:Value.Вот пример с несколькими строками, с разным порядком и полнотой каждой пары:

x  <- "Color:Red,|Texture:Rough,|Shape:Circular,|ID:1323,|Location:Canada,|Video-Status:Yes"
x2 <- "Texture:Rough,|Color:Red,|Shape:Circular,|ID:1323,|Location:Canada"
dat <- data.frame(col = c(x,x2), stringsAsFactors=FALSE)

dat
#                                                                                   col
#1 Color:Red,|Texture:Rough,|Shape:Circular,|ID:1323,|Location:Canada,|Video-Status:Yes
#2                   Texture:Rough,|Color:Red,|Shape:Circular,|ID:1323,|Location:Canada

Затем обработайте после свертывания в один длинный фрагмент текста с разрывами строк:

read.dcf(textConnection(paste(gsub(",[|]", "\n", dat$col), collapse="\n\n")))
#     Color Texture Shape      ID     Location Video-Status
#[1,] "Red" "Rough" "Circular" "1323" "Canada" "Yes"       
#[2,] "Red" "Rough" "Circular" "1323" "Canada" NA  
...