Можно использовать опцию tidyverse
и splitstackshape
.Сначала прочитайте данные файла, используя, скажем, read.table
(с аргументом sep="\t"
).Затем разделите столбец V5
, используя splitstackshape::splitstackshape
, на другие столбцы.Теперь данные готовы для преобразования в длинный формат и обработки.
library(tidyverse)
library(splitstackshape)
# If first 4 columns of "textdata" is separated by "multiple spaces" than read it as
df <- read.table(text = gsub("\\s{2,}","\t",textdata), stringsAsFactors = FALSE, sep = "\t")
# If first 4 columns of "textdata" is separated by "tab" than read it as
df <- read.table(text = textdata, stringsAsFactors = FALSE, sep = "\t")
# Now, process data (Based on feedback from `@crazysantaclaus`)
df %>% cSplit("V5", sep=";") %>%
gather(Key, value, -c(V1,V2,V3,V4)) %>%
separate(value, c("Col","Value"), sep="=") %>%
select(-Key) %>%
filter(!(is.na(Col) & is.na(Value))) %>%
spread(Col, Value)
Результат:
# V1 V2 V3 V4 col1 col2 col3 col4 col5 col6
#1 A1 something_101 789 910 STRING_2 string_integer string with whitespace and:colon STRING string with whitespace and special chars <NA>
#2 A1 something_100 123 456 STRING_1 <NA> string with whitespace and:colon STRING string with whitespace and special chars string
Данные:
textdata <- "A1 something_100 123 456 col1=STRING_1;col3=string with whitespace and:colon;col4=STRING;col5=string with whitespace and special chars;col6=string
A1 something_101 789 910 col1=STRING_2;col2=string_integer;col3=string with whitespace and:colon;col4=STRING;col5=string with whitespace and special chars"
Данные № 2:
2-й набор данных.Начальные 4 столбца не разделены \t
, а те, которые разделены кратными spaces
textdata <- "A1 something_100 123 456 col1=STRING_1;col3=string with whitespace and:colon;col4=STRING;col5=string with whitespace and special chars;col6=string
A1 something_101 789 910 col1=STRING_2;col2=string_integer;col3=string with whitespace and:colon;col4=STRING;col5=string with whitespace and special chars"