首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在do.call(rbind)上设置列名

在do.call(rbind)上设置列名
EN

Stack Overflow用户
提问于 2020-02-21 10:07:50
回答 1查看 481关注 0票数 0

总之,我希望向XTS对象添加一个累积卷列。但是,在调用do.call(rbind...时,我发现原来的XTS会被覆盖。

代码语言:javascript
复制
# Reproducible example data
foo <- rnorm(5)
bar <- seq(as.Date("1970-01-01"), length = 5, by = "days")
foobar <- xts(x = foo, order.by = bar)
names(foobar)[1] <- "Volume"
# My processing ...
foobar_months <- split(foobar[,"Volume"],f="months")
foobar_vol_mtd <- lapply(foobar_months,FUN=cumsum)
# This is what is not working for me because Volume overwrites original Volume
foobar <- do.call(rbind,foobar_vol_mtd) 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-21 10:19:30

函数do.call(rbind, list)将对所有列表元素进行重新绑定。您没有将该列表追加到原始列表中。你能做的就是:

代码语言:javascript
复制
foobar2 <- do.call(rbind,foobar_vol_mtd)
foobar <- rbind(foobar, foobar2)

将该列表中的所有元素重新绑定到一起,然后将结果重新绑定到原始元素。

结果:

代码语言:javascript
复制
               Volume
1970-01-01  0.8995890
1970-01-01  0.8995890
1970-01-02 -0.5057975
1970-01-02  0.3937916
1970-01-03 -0.1861275
1970-01-03  0.2076641
1970-01-04 -1.1641303
1970-01-04 -0.9564663
1970-01-05  0.3157536
1970-01-05 -0.6407127

结果将因rnorm(5)和没有种子结实率而有所不同。

附加为新列

正如我所说的,rbind附加新行,所有列都应该是相同的。如果要作为新列追加,请尝试:

代码语言:javascript
复制
foobar2 <- do.call(rbind,foobar_vol_mtd)
foobar3 = merge(foobar, foobar2)

对于这种情况,我的结果是(新的随机值,所以不要与上面的比较):

代码语言:javascript
复制
                Volume  Volume.1
1970-01-01  1.96291153 1.9629115
1970-01-02 -0.41771710 1.5451944
1970-01-03 -0.08827657 1.4569179
1970-01-04 -0.57243569 0.8844822
1970-01-05 -0.06093953 0.8235426

然后用names(foobar)[2] = "new_name"更改列名。

还可以在合并之前重命名:

代码语言:javascript
复制
foobar2 <- do.call(rbind,foobar_vol_mtd)
names(foobar2) = 'newname'
foobar3 = merge(foobar, foobar2)

与以前一样,合并将按时间索引完成。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60336327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档