splitstackshape для разделения текста на основе разных разделителей строк n для столбцов и наблюдений

#r #splitstackshape

#r #splitstackshape

Вопрос:

У меня есть некоторые текстовые данные, которые выглядят так:

 > myData
                                                                                                                                                                keyColumn
1 nnnnCol1nnCol1 result.nnnnCol2nnResult col2.nnnnCol3nn-nnnnCol4nnresult col4nnnncol5nn€result col5nnnnCol6nnresult col6nnnnnn
  

Он структурирован, и я хотел бы разделить текст на столбцы. Структура всегда одинакова. То есть, учитывая:

 nnnnCol1nnCol1 result.
  

Из этого следует, что имя столбца должно быть после 4 разделителей строк, а результат — после 2 разделителей строк.

Я пробовал использовать splitstackshape пакет.

 library(splitstackshape)
cSplit(myData, splitCols = "keyColumn", sep = "nnnn", direction = "wide")
  

Что дает:

    keyColumn_01 keyColumn_02 keyColumn_03 keyColumn_04 keyColumn_05 keyColumn_06 keyColumn_07 keyColumn_08 keyColumn_09 keyColumn_10 keyColumn_11 keyColumn_12
1:         Col1 Col1 result.         Col2 Result col2.         Col3            -         Col4  result col4         col5 €result col5         Col6  result col6
  

Это не совсем то, что я хотел, но близко.

Ожидаемый результат:

 Col1           Col2            Col3     Col4          col5           Col6
Col1 result    Result col2      -      result col4   €result col5    result col6
  

Данные:

 myData <- structure(list(keyColumn = "nnnnCol1nnCol1 result.nnnnCol2nnResult col2.nnnnCol3nn-nnnnCol4nnresult col4nnnncol5nn200result col5nnnnCol6nnresult col6nnnnnn"), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                                                                                    -1L))
  

Ответ №1:

В базе R вы могли бы сделать:

 read.csv(text=gsub("n{2,}",",",gsub("n{4}","n",myData$keyColumn)), header = FALSE)
    V1           V2
1 Col1 Col1 result.
2 Col2 Result col2.
3 Col3            -
4 Col4  result col4
5 col5 €result col5
6 Col6  result col6
  

Исходя из этого, вы могли бы транспонировать и форматировать его так, как хотите

Ответ №2:

Как и в ответе Onyambu, лучший подход — сначала каким-то образом перевести данные в длинный формат, а затем преобразовать их в широкий формат. Вот один из подходов:

 cSplit(myData, "keyColumn", "n", "long")[, 
  list(col = keyColumn[c(TRUE, FALSE)], val = keyColumn[c(FALSE, TRUE)])][, 
  dcast(.SD, ... ~ col, value.var = "val")]
#    .         Col1         Col2 Col3        Col4         col5        Col6
# 1: . Col1 result. Result col2.    - result col4 €result col5 result col6
  

В качестве альтернативы, в base R вы также можете сделать что-то вроде:

 x <- strsplit(trimws(myData$keyColumn), "n ")[[1]]
data.frame(setNames(as.list(x[c(FALSE, TRUE)]), x[c(TRUE, FALSE)]))
#           Col1         Col2 Col3        Col4         col5        Col6
# 1 Col1 result. Result col2.    - result col4 €result col5 result col6