繁体   English   中英

如何按日期将向量拆分为数据帧?

[英]How do i split a vector into a data frame by date?

我正在尝试通过日期和ID拆分此数据框:

         Id       Date    Returns
1 039229109 1996-12-31  0.4739285
2 039229109 1997-01-02 -1.8867910
3 039229109 1997-01-03  0.4807711
4 056180102 1996-12-31 -4.9504940
5 056180102 1997-01-02  2.6041627
6 056180102 1997-01-03  0.0000000
7 096650106 1996-12-31 -2.0872890
8 096650106 1997-01-02 -1.8410861
9 096650106 1997-01-03  1.4807463

这样它将看起来像这样:

            Date  039229109 056180102 096650106
    1 1996-12-31  0.4739285 -4.950494 -2.087289
    2 1997-01-02 -1.8867910  2.604163 -1.841086
    3 1997-01-03  0.4807711  0.000000  1.480746

我尝试使用:

   > aggregate(data,by = list(data$Date),identity)

但这返回此:

     Group.1      Id.1      Id.2      Id.3 Date.1 Date.2 Date.3  Returns.1  Returns.2  Returns.3
1 1996-12-31 039229109 056180102 096650106   9861   9861   9861  0.4739285 -4.9504940 -2.0872890
2 1997-01-02 039229109 056180102 096650106   9863   9863   9863 -1.8867910  2.6041627 -1.8410861
3 1997-01-03 039229109 056180102 096650106   9864   9864   9864  0.4807711  0.0000000  1.4807463

我对聚合很陌生,觉得这应该很简单,但是我找不到解决方法。 (我尝试使用重塑,但不了解,无法获得有意义的结果。)

谢谢你的帮助!

编辑:更改并格式化数据。

这实际上是一个重塑问题,而不是聚合问题。 这可能就是为什么您在使用aggregate遇到困难的原因。 所以如果这是您的样本数据

data<-structure(list(Id = c("039229109", "039229109", "039229109", 
"056180102", "056180102", "056180102", "096650106", "096650106", 
"096650106", "172736100", "172736100", "172736100", "208368100", 
"208368100", "208368100"), Date = structure(c(9861, 9863, 9864, 
9861, 9863, 9864, 9861, 9863, 9864, 9861, 9863, 9864, 9861, 9863, 
9864), class = "Date"), fg.total.returnc = c(0.4739285, -1.886791, 
0.4807711, -4.950494, 2.6041627, 0, -2.087289, -1.8410861, 1.4807463, 
-0.8130074, 0.8196712, 0.8130074, -0.1253128, -0.6273508, 0.1262665
)), .Names = c("Id", "Date", "fg.total.returnc"), row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15"), class = "data.frame")

然后您可以使用基本函数reshape() 例如

ww <- reshape(data, timevar="Id", idvar="Date", direction="wide")
names(ww) <- gsub("fg.total.returnc.","", names(ww), fixed=T)
ww

#         Date  039229109 056180102 096650106  172736100  208368100
# 1 1996-12-31  0.4739285 -4.950494 -2.087289 -0.8130074 -0.1253128
# 2 1997-01-02 -1.8867910  2.604163 -1.841086  0.8196712 -0.6273508
# 3 1997-01-03  0.4807711  0.000000  1.480746  0.8130074  0.1262665

这有点尴尬,因为在示例中ID和Date的角色已切换。 我认为更好的方法是使用reshape2库。

library(reshape2)
dcast(data, Date~Id)

#         Date  039229109 056180102 096650106  172736100  208368100
# 1 1996-12-31  0.4739285 -4.950494 -2.087289 -0.8130074 -0.1253128
# 2 1997-01-02 -1.8867910  2.604163 -1.841086  0.8196712 -0.6273508
# 3 1997-01-03  0.4807711  0.000000  1.480746  0.8130074  0.1262665

基本R中的一个不错的选择是使用xtabs

> xtabs(fg.total.returnc ~ Date + Id, data)
            Id
Date          039229109  056180102  096650106  172736100  208368100
  1996-12-31  0.4739285 -4.9504940 -2.0872890 -0.8130074 -0.1253128
  1997-01-02 -1.8867910  2.6041627 -1.8410861  0.8196712 -0.6273508
  1997-01-03  0.4807711  0.0000000  1.4807463  0.8130074  0.1262665

结果是一个具有xtabstable class es的matrix ,因此,如果需要data.frame ,请确保将上面的内容包装为as.data.frame.matrix而不是as.data.frame (因为后者只是让您回到开始的位置)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM