Импорт одной длинной строки данных с пробелами в R - PullRequest
3 голосов
/ 05 декабря 2011

Этот вопрос является продолжением моего предыдущего вопроса, Импорт одной длинной строки данных в R .

У меня большой файл данных, состоящий из одной строки текста.Формат напоминает

Cat    14         15  Horse  16

В конечном итоге я хотел бы поместить его в data.frame.В приведенном выше примере я бы в итоге две переменные, две переменные, Animal и Number.Количество символов в каждой «строке» является фиксированным, поэтому в приведенном выше примере каждая строка содержит 11 символов, животные - первые 7, а цифры - следующие четыре.

Итак, мне нужны данныекадр, который выглядит так:

Animal Number
   Cat     14
    NA     15
 Horse     16

Ответы [ 5 ]

2 голосов
/ 06 декабря 2011

Решение с векторной функцией подстроки.

x <- readLines(textConnection("Cat    14         15  Horse  16  "))
idx <- seq.int(1,nchar(x),by=11)
vsubstr <- Vectorize(substr,vectorize.args=c("start","stop"))
dat <- data.frame(Animal= vsubstr(x,idx,idx+6),
                  Number= as.numeric(vsubstr(x,idx+7,idx+10)))
2 голосов
/ 06 декабря 2011

Вы можете прочитать файл с помощью read.fwf, указав ширину столбцов и количество столбцов:

inp.fwf <- read.fwf("tmp.txt", widths = rep(c(7, 4), times = 3), as.is = TRUE)

Здесь аргумент times = 3 работает для ваших примеров данных;для вашего реального файла вам нужно будет указать количество пар и изменить times соответственно.Если вы не знаете, сколько у вас есть записей, это может сработать:

inp.rl <- readLines("tmp.txt")
nchar(inp.rl)/11

Это даст вам data.frame с одной строкой и множеством столбцов.Вам нужно разбить это на множество строк и двух столбцов:

inp.mat <- matrix(inp.fwf, byrow = TRUE, ncol = 2)

Это даст вам правильную форму для ваших данных.Имена животных хранятся в виде символьных векторов, которые вы, вероятно, захотите изменить на факторы, но на данный момент все данные находятся в R, так что вы можете легко настроить их.

1 голос
/ 06 декабря 2011

Использование Тайлером read.fwf, возможно, чище, но вот другой возможный метод.

x <- readLines(textConnection("Cat    14         15  Horse  16  "))
x <- matrix(strsplit(x, "")[[1]], nrow=11)
d <- data.frame(Animal = apply(x[1:7,], 2, paste, collapse=""),
                Number = as.numeric(apply(x[8:11,], 2, paste, collapse="")))
1 голос
/ 06 декабря 2011

Предположим, у вас есть текстовый файл test.dat с повторяющимися парами номеров животных.

x <- scan("test.dat", what=list("", 0))
my.df <- data.frame(Animal = x[[1]], Number = x[[2]])
1 голос
/ 05 декабря 2011

Не уверен, что это за 15 из того, как вы описали данные, это должно быть животное-пространство-количество-пространство-животное ...

В любом случае, если 15 здесь не должно быть, есть один подход.

list1<-"Cat 14 Horse 16" 

x <- unlist(strsplit(list1, " "))
            x <- as.data.frame(matrix(x, length(x)/2, 2, byrow = TRUE))
            x[, 2] <- as.numeric(as.character(x[, 2]))
            x[, 1] <- as.character(x[, 1])
names(x) <-c('animal', 'count')   
x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...