Извлечение значений из грязной массы данных - PullRequest
0 голосов
/ 23 мая 2018

У меня грязная масса данных, из которых я хотел бы извлечь информацию.Сейчас я не совсем нашел удобный способ извлечения информации и надеюсь, вы сможете помочь.Мои данные выглядят так:

"\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nChannels\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\
       n\r\nDates\r\nSeptember 25th 2016 To September 26th 
         2016\r\n\r\n\r\nPlatform\r\nIdea\r\n\r\n\r\nCountry\r\nUnited 
         States\r\n\r\n\r\nRestricted Countries\r\n\r\n\t\t\t\t\t\t\t\t\tUnited 
         States\t\t\t\t\t\t\t\t\r\n\r\n\r\nInitial Price\r\n$0.0692\r\n\r\n\r\n"

Теперь я хотел бы получить из этого:

Channels                - 
Dates                   September 25th 2016 To September 26th 2016
Platform                Idea
Country                 United States
Restricted Countries    United States
Initial Price           $0.0692

Мне нужно будет выполнить эту задачу для большего числа наблюденийа затем сохранить каждую переменную как вектор всех наблюдений.Таким образом, мне не нужно хранить имя переменной (т.е. «Платформа»), а только результат («Идея»).Но для этого мне понадобится имя переменной «Платформа» в качестве «Идентификатора», я бы предположил, так как положение переменной в тексте меняется в зависимости от изменений наблюдений (как и количество переменных - хотя и незначительно).

Теперь, я думаю, пакет stringr - хороший способ сделать это, но я не нашел удобного способа сделать это.

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Решение Base R:

yourstring1 <- "\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nChannels\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\
n\r\nDates\r\nSeptember 25th 2016 To September 26th 
2016\r\n\r\n\r\nPlatform\r\nIdea\r\n\r\n\r\nCountry\r\nUnited 
States\r\n\r\n\r\nRestricted Countries\r\n\r\n\t\t\t\t\t\t\t\t\tUnited 
States\t\t\t\t\t\t\t\t\r\n\r\n\r\nInitial Price\r\n$0.0692\r\n\r\n\r\n"

# make a placeholder (useful when manipulating strings for easier regex)
yourstring2 <- gsub("\r|\t|\nn|\n", "@", yourstring1, perl = T) # please note the double nn - this is so because a newline character is added when copying from here to R
# split on placeholder if it appears twice or more
yourstring2 <- unlist(strsplit(yourstring2, split = "@{2,}"))
# little cleaning needed
yourstring2 <- gsub(" @", " ", yourstring2)
yourstring2[1:2] <- c(yourstring2[2], "-") # this hard-coded solution works for the particular example, if you have many strings with arbitrarily missing values, you may want to make a little condition for that
# prepare your columns by indexing the character vector
variables <- yourstring2[seq(from = 1, to = length(yourstring2), by = 2)]
values <- yourstring2[seq(from = 2, to = length(yourstring2), by = 2)]
# bind them to dataframe
df <- data.frame(variables, values)

Результирующий df:

df
             variables                                     values
1             Channels                                          -
2                Dates September 25th 2016 To September 26th 2016
3             Platform                                       Idea
4              Country                              United States
5 Restricted Countries                              United States
6        Initial Price                                    $0.0692

РЕДАКТИРОВАТЬ: только сейчас я правильно прочитал, что вместо фрейма данных желаемый результат может быть векторомпозиции ... вот решение с двумя строками для этого

yourstring2 <- gsub("\r|\t|\nn|\n", "", yourstring1, perl = T) #clean the original string (see above yourstring1)
yourvector <- unlist(strsplit(yourstring2, split = "Channels|Dates|Platform|Country|Restricted Countries|Initial Price", perl = T))[-1]  # extract

Результирующий вектор:

   > yourvector
[1] ""                                          
[2] "September 25th 2016 To September 26th 2016"
[3] "Idea"                                      
[4] "United States"                             
[5] "United States"                             
[6] "$0.0692"  
0 голосов
/ 23 мая 2018

Если входная строка является вашей, результатом будет один фрейм данных с одной переменной на ключевое слово (пропущенные значения для неиспользуемых ключевых слов), по одной строке для каждого ввода:

a <- gsub("\\t*(\\r\\n)+\\t*","/",a)
a <- gsub("(^/|/$)","",a)
a <- gsub("(Channels|Dates|Platform|Country|Restricted Countries|Initial Price)","<\\1>",a)
a <- gsub(">/<",">//<",a)
b <- strsplit(a,"/")
c <- purrr::map(b,
   function(x) {
        dim(x) <-  c(2,length(x)/2)
        tidyr::spread(as.data.frame(t(x),stringsAsFactors=FALSE),V1,V2)
    })
replyr::replyr_bind_rows(c)
0 голосов
/ 23 мая 2018

Следующее регулярное выражение извлекает нужные значения.Значения хранятся в столбцах 2-7 результирующей матрицы.Код работает с входным вектором (каждая запись образует новую строку в матрице)

library(stringr)

input <- "\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nChannels\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nDates\r\nSeptember 25th 2016 To September 26th 2016\r\n\r\n\r\nPlatform\r\nIdea\r\n\r\n\r\nCountry\r\nUnited States\r\n\r\n\r\nRestricted Countries\r\n\r\n\t\t\t\t\t\t\t\t\tUnited States\t\t\t\t\t\t\t\t\r\n\r\n\r\nInitial Price\r\n$0.0692\r\n\r\n\r\n"

str_match(input, paste0("[[:space:]]*Channels[[:cntrl:]]+([[:print:]]+)?",
                        "[[:space:]]*Dates[[:cntrl:]]+([[:print:]]+)?",
                        "[[:space:]]*Platform[[:cntrl:]]+([[:print:]]+)?",
                        "[[:space:]]*Country[[:cntrl:]]+([[:print:]]+)?",
                        "[[:space:]]*Restricted Countries[[:cntrl:]]+([[:print:]]+)?",
                        "[[:space:]]*Initial Price[[:cntrl:]]+([[:print:]]+)?",
                        "[[:space:]]*"))

Редактировать: Извините, я упустил из виду, что положение переменных в тексте может изменяться между различными входами.В этом случае вы не можете легко извлечь все переменные с помощью этого метода.Тем не менее, вы все равно можете извлечь их по одному, используя только соответствующую строку в регулярном выражении выше.Если переменная отсутствует (например, «Каналы» в вашем примере), это не проблема - она ​​будет выглядеть как NA).

...