Извлечение фрейма данных из строк между значениями в R - PullRequest
2 голосов
/ 01 марта 2020

Я делаю кодирование в R, и я имею дело со случаями, когда некоторые кадры данных кодируются как отдельные строки, и необходимо иметь возможность восстанавливать кадры данных из строк. Строки имеют следующую форму:

|Carrot^14|Cucumber^3|Potato^8|

Разделитель | разделяет строки фрейма данных, а разделитель ^ отделяет столбец со значением символа от столбца с цифрой c ценность. (Чтобы упростить проблему, обратите внимание, что эти символы появляются только как разделители - они никогда не появляются в значениях во фрейме данных.) Фрейм данных, соответствующий этой строке, будет:

 Vegetable  Quantity
  "Carrot"        14
"Cucumber"         3
  "Potato"         8

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

Мои вопросы: Имеет ли это вид кодирования из фрейма данных в одну строку (и обратно) имеют конкретное имя? Как я могу декодировать строку в R?

Ответы [ 4 ]

5 голосов
/ 01 марта 2020

Вы можете поменять вертикальную черту на символ новой строки, затем использовать read.table().

txt <- "|Carrot^14|Cucumber^3|Potato^8|"

read.table(text = gsub("\\|", "\n", txt), sep = "^", col.names = c("Vegetable", "Quantity"))

  Vegetable Quantity
1    Carrot       14
2  Cucumber        3
3    Potato        8
2 голосов
/ 01 марта 2020

Мы можем удалить разделители в начале и конце строки с помощью gsub, получить данные в отдельных строках на основе (|) разделителя и в отдельные столбцы на основе (^) разделителя.

library(dplyr)
library(tidyr)

df %>%
  mutate(col = gsub('^\\||\\|$', '' ,col)) %>%
  separate_rows(col, sep = "\\|") %>%
  separate(col, into = c('Vegetable', 'Quantity'), sep = "\\^", convert = TRUE)

#  Vegetable Quantity
#1    Carrot       14
#2  Cucumber        3
#3    Potato        8

данные

df <- data.frame(col = "|Carrot^14|Cucumber^3|Potato^8|", stringsAsFactors = FALSE)
2 голосов
/ 01 марта 2020

Одним из способов будет непосредственное извлечение названий и номеров овощей. Для овощей я извлек символы, которые остаются между | и ^. Для цифр я просто извлек числовые буквы. Я преобразовал их в цифры c.

library(stringi)

data.frame(vegetable = unlist(stri_extract_all_regex(str = foo$whatever,
                                      pattern = "(?<=\\|)[A-z]+(?=\\^)")),
           quantity = as.numeric(unlist(stri_extract_all_regex(str = foo$whatever, pattern = "[0-9]+")))
           )

  vegetable quantity
1    Carrot       14
2  Cucumber        3
3    Potato        8
4    Carrot       20
5  Cucumber        5
6    Potato       12

ДАННЫЕ

foo <- structure(list(whatever = c("|Carrot^14|Cucumber^3|Potato^8|", 
"|Carrot^20|Cucumber^5|Potato^12|")), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"))
1 голос
/ 01 марта 2020

Вы можете попробовать следующее базовое решение R

df <- setNames(data.frame(do.call(rbind,
                   strsplit(unlist(regmatches(s,gregexpr("(?<=\\|).*?(?=\\|)",s,perl = TRUE))),
                            "\\^"))),
                  c("Vegatable","Quantity"))
df$Quantity <- as.numeric(df$Quantity)

так, чтобы

> df
  Vegatable Quantity
1    Carrot        1
2  Cucumber        2
3    Potato        3

ДАННЫЕ

s <- "|Carrot^14|Cucumber^3|Potato^8|"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...