我在一列中有一些不规则的数据。
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
答案 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")