Альтернатива нужна для снятия стека - PullRequest
1 голос
/ 05 января 2012

У меня есть некоторые неправильные данные в одном столбце.

my.table <-read.table(text="ticker,date,last
a,12/20/2011,289295
a,12/21/2011,NA
a,12/27/2011,297001
a,12/28/2011,NA
b,12/20/2011,151253
b,12/21/2011,NA
b,12/27/2011,152413
b,12/28/2011,NA
b,1/4/2012,NA
d,12/21/2011,98.52
d,12/28/2011,99.36
d,1/4/2012,103.22", header=TRUE, as.is=TRUE,sep = ",")

Я обычно использую unstack, чтобы изменить свои данные в data.frame.Но unstack не работает, потому что количество элементов отличается и не может быть помещено в формат data.frame.

my.expression <-last~ticker
unstacked <- unstack(my.table, my.expression ) #Not a data.frame

Я бы хотел, чтобы моя таблица выглядела так:

               a       b     c
12/20/2011  289295  151253   NA
12/21/2011  NA      NA     98.52
12/27/2011  297001  152413   NA
12/28/2011  NA      NA     99.36
1/4/2012    NA      NA     103.22

Ответы [ 3 ]

5 голосов
/ 05 января 2012

Вы смотрели на reshape2 пакет?

library("reshape2")
dcast(my.table, date~ticker)

, что дает

Using last as value column: use value.var to override.
        date      a      b      d
1   1/4/2012     NA     NA 103.22
2 12/20/2011 289295 151253     NA
3 12/21/2011     NA     NA  98.52
4 12/27/2011 297001 152413     NA
5 12/28/2011     NA     NA  99.36

или если вы хотите сначала преобразовать даты во внутренний формат даты

my.table$date <- as.Date(my.table$date, format="%m/%d/%Y")
dcast(my.table, date~ticker)

, что дает

Using last as value column: use value.var to override.
        date      a      b      d
1 2011-12-20 289295 151253     NA
2 2011-12-21     NA     NA  98.52
3 2011-12-27 297001 152413     NA
4 2011-12-28     NA     NA  99.36
5 2012-01-04     NA     NA 103.22
4 голосов
/ 05 января 2012
 with(my.table, tapply(last, list(date, ticker),  I))
                a      b      d
1/4/2012       NA     NA 103.22
12/20/2011 289295 151253     NA
12/21/2011     NA     NA  98.52
12/27/2011 297001 152413     NA
12/28/2011     NA     NA  99.36

(сортировка по алфавиту из-за отсутствия переменной класса).

 my.table$date.dt <- as.Date(my.table$date, format="%m/%d/%Y")
 with(my.table, tapply(last, list(date.dt, ticker),  I))
                a      b      d
2011-12-20 289295 151253     NA
2011-12-21     NA     NA  98.52
2011-12-27 297001 152413     NA
2011-12-28     NA     NA  99.36
2012-01-04     NA     NA 103.22

Чтобы ответить на комментарий ниже: Если он вам нужен как блок данных, а не как таблица, вы будетенужно обернуть as.data.frame вокруг результатов:

as.data.frame(with(my.table, tapply(last, list(date.dt, ticker),  identity)))
2 голосов
/ 06 января 2012

Если данные находятся в файле data.txt, попробуйте это.Аргументы относятся к имени файла, факту, что у данных есть заголовок, символ разделителя полей - запятая, первый столбец должен быть разделен, второй столбец - индекс времени, и формат индекса времени такой, как указано,

library(zoo)
z <- read.zoo("data.txt", header = TRUE, sep = ",", split = 1, index = 2, 
       format= "%m/%d/%Y")

Полученный объект-зоопарк представляет собой временной ряд с одним столбцом на тикер:

> z
                a      b      d
2011-12-20 289295 151253     NA
2011-12-21     NA     NA  98.52
2011-12-27 297001 152413     NA
2011-12-28     NA     NA  99.36
2012-01-04     NA     NA 103.22

Вышеприведенное считывает и преобразовывает все сразу, но если вы уже прочитали егов my.table используя код в вопросе, то это просто так:

z <- read.zoo(my.table, split = 1, index = 2, format = "%m/%d/%Y")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...