импорт и очистка текстового файла в R - PullRequest
0 голосов
/ 01 июня 2018

У меня есть данные в текстовом файле в следующем формате.

(0,00, 1,00), (1,00, 0,93), (2,00, 0,86), (3,00, 0,8), (4,00, 0,75), (5,00, 0,7), (6,00, 0,65), (7,00, 0,6), (8,00, 0,56), (9,00, 0,52), (10,0, 0,49)

Первый элемент в скобках - xи второй элемент у.Как создать матрицу в следующем формате.

    x    y
    0    1
    1    0.93
    2    0.86
    3    0.8
    4    0.75

Я пробовал варианты read.table, но безуспешно.Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Сначала мы сохраняем вашу строку в виде файла, чтобы решение было воспроизводимым:

str0 <- "(0.00, 1.00), (1.00, 0.93), (2.00, 0.86), (3.00, 0.8), (4.00, 0.75), (5.00, 0.7), (6.00, 0.65), (7.00, 0.6), (8.00, 0.56), (9.00, 0.52), (10.0, 0.49)"
file1 <- "str1.xt"
write(str0,file1)

решение:

x <-  scan(file1, character())
x <-  as.numeric(gsub("[(,)]","",x))
x <-  matrix(x,ncol = 2,byrow = TRUE,dimnames = list(NULL,c("x","y")))
as.data.frame(x)
 # x    y
 # 1   0 1.00
 # 2   1 0.93
 # 3   2 0.86
 # 4   3 0.80
 # 5   4 0.75
 # 6   5 0.70
 # 7   6 0.65
 # 8   7 0.60
 # 9   8 0.56
 # 10  9 0.52
 # 11 10 0.49

альтернативное решение:

x <- gsub("), (",", ",scan(file1, character(),sep="_"),fixed = T)
as.data.frame(eval(parse(text=paste0("matrix(c",x,",ncol = 2,byrow = TRUE,dimnames = list(NULL,c('x','y')))"))))
0 голосов
/ 01 июня 2018

Как насчет этого?

text <-
    "(0.00, 1.00), (1.00, 0.93), (2.00, 0.86), (3.00, 0.8), (4.00, 0.75), (5.00, 0.7), (6.00, 0.65), (7.00, 0.6), (8.00, 0.56), (9.00, 0.52), (10.0, 0.49)";

do.call(rbind, lapply(
    gsub("(\\s*\\(|\\)\\s*)", "", unlist(strsplit(text, split = "),"))),
    function(x) as.numeric(unlist(strsplit(x, ", ")))))
#      [,1] [,2]
# [1,]    0 1.00
# [2,]    1 0.93
# [3,]    2 0.86
# [4,]    3 0.80
# [5,]    4 0.75
# [6,]    5 0.70
# [7,]    6 0.65
# [8,]    7 0.60
# [9,]    8 0.56
#[10,]    9 0.52
#[11,]   10 0.49

Объяснение: Сначала мы разделяем записи на "),", чтобы разделить строки, а после некоторой очистки разделяем записи на ", " на записи столбцов в строке.

Или чтобы избежать do.call(rbind, ...)

t(sapply(
    gsub("(\\s*\\(|\\)\\s*)", "", unlist(strsplit(text, split = "),"))),
    function(x) as.numeric(unlist(strsplit(x, ", ")))))
#           [,1] [,2]
#0.00, 1.00    0 1.00
#1.00, 0.93    1 0.93
#2.00, 0.86    2 0.86
#3.00, 0.8     3 0.80
#4.00, 0.75    4 0.75
#5.00, 0.7     5 0.70
#6.00, 0.65    6 0.65
#7.00, 0.6     7 0.60
#8.00, 0.56    8 0.56
#9.00, 0.52    9 0.52
#10.0, 0.49   10 0.49
...