Преобразовать строку с разделителями табуляции в фрейм данных - PullRequest
0 голосов
/ 07 ноября 2018

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

char.string <- "BAT\\tUSA\\t\\tmedium\\t0.8872\\t9\\tOff production\\tCal1|Cal2\\r\\nGNAT\\tCAN\\t\\small\\t0.3824\\t11\\tOff production\\tCal3|Cal8|Cal9\\r\\n"

Я попробовал следующее.

df <- data.frame(do.call(rbind, strsplit(char.string, "\t", fixed=TRUE)))

df <- ldply (df, data.frame)

Первый возвращает вектор. Второй возвращает тысячи строк и два столбца, один из которых состоит из последовательных чисел, а второй - из всех данных.

Я пытаюсь добиться этого:

item = c("BAT", "GNAT")
origin = c("USA", "CAN")
size = c("medium", "small")
lot = c("0.8872", "0.3824")
mfgr = c("9", "11")
stat = c("Off production", "Off production")
line = c("Cal1|Cal2", "Cal3|Cal8|Cal9")

df = data.frame(item, origin, size, lot, mfgr, stat, line)
df

  item origin   size    lot mfgr           stat           line
1  BAT    USA medium 0.8872    9 Off production      Cal1|Cal2
2 GNAT    CAN  small 0.3824   11 Off production Cal3|Cal8|Cal9

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Я взял на себя смелость из-за опечаток в вашей char.string .

library(tidyverse)

char.string <- "BAT\\tUSA\\tmedium\\t0.8872\\t9\\tOff production\\tCal1|Cal2\\r\\nGNAT\\tCAN\\tsmall\\t0.3824\\t11\\tOff production\\tCal3|Cal8|Cal9\\n"

lapply(
    str_split(gsub("\\\\n", "", char.string), "\\\\r")[[1]]
    , function(x) {
        y <- str_split(x, "\\\\t")[[1]]
        data.frame(
            item = y[1]
            , origin = y[2]
            , size = y[3]
            , lot = y[4]
            , mfgr = y[5]
            , stat = y[6]
            , line = y[7]
            , stringsAsFactors = F
        )
    }) %>%
    bind_rows()

  item origin   size    lot mfgr           stat           line
1  BAT    USA medium 0.8872    9 Off production      Cal1|Cal2
2 GNAT    CAN  small 0.3824   11 Off production Cal3|Cal8|Cal9
0 голосов
/ 07 ноября 2018

read.table() на самом деле все должно быть в порядке, но у вас есть две основные проблемы:

  1. Есть две опечатки
    а. Я предполагаю, что вы не хотите \\small, а скорее small
    б. У вас есть \\t\\tmedium, где, я думаю, вы хотите просто \\tmedium
  2. "\\t" не совпадает с "\t"

Попробуйте это

# Start with your original input
char.string <- "BAT\\tUSA\\t\\tmedium\\t0.8872\\t9\\tOff production\\tCal1|Cal2\\r\\nGNAT\\tCAN\\t\\small\\t0.3824\\t11\\tOff production\\tCal3|Cal8|Cal9\\r\\n"
# Eliminate the typos
char.string <- sub("\\\\s", "s", char.string)
char.string <- sub("\\\\t\\\\t", "\\\\t", char.string)
# Convert \\t, etc. to actual tabs and newlines
char.string <- gsub("\\\\t", "\t", char.string)
char.string <- gsub("\\\\r", "\r", char.string)
char.string <- gsub("\\\\n", "\n", char.string)
# Read the data into a dataframe
df <- read.table(text = char.string, sep = "\t")
# Add the colnames
colnames(df) <- c("item", "origin", "size", "lot", "mfgr", "stat", "line")
# And take a look at the result
df



  item origin   size    lot mfgr           stat           line
1  BAT    USA medium 0.8872    9 Off production      Cal1|Cal2
2 GNAT    CAN  small 0.3824   11 Off production Cal3|Cal8|Cal9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...