拆散所需的替代方案

时间:2012-01-05 17:33:49

标签: r

我在一列中有一些不规则的数据。

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 个答案:

答案 0 :(得分:5)

你看过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

答案 1 :(得分:4)

 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 :(得分:2)

假设数据位于文件data.txt中,请尝试此操作。参数引用文件名,数据具有标题,字段分隔符是逗号,第一列要拆分,第二列是时间索引,时间索引的格式如指示。

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

生成的zoo对象表示每个滚动条有一列的时间序列:

> 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")