r - 有效地将多个列对绑定到 1 列中
问题描述
我已经按照我的需要配置了数据,但它需要 15 行代码。我确信它可以在 1 或 2 内完成,我希望在这方面做得更好的人可以教我如何做。这里是...
我有一个包含 11 个变量的表,其中包含一个日期、4 对价差和价格观察值,然后是与数据列对应的年份和季度。4对数据分别对应不同的TBA抵押券(3%、3.5%、4%、4.5%)。
我需要将 8 列放在名为 ZSpread 和 Price 的 2 列中,然后每对都标记有优惠券类型。
这是我使用的代码。谢谢!
mbs3 <- mbstrimlast[,c("Date",ZSpread="FN3sprd",Price="FN3px")]
names(mbs3) <- c("Date","Zspread","Price")
mbs3.5 <- mbstrimlast[,c("Date",ZSpread="FN3.5sprd",Price="FN3.5px")]
names(mbs3.5) <- c("Date","Zspread","Price")
mbs4 <- mbstrimlast[,c("Date",ZSpread="FN4sprd",Price="FN4px")]
names(mbs4) <- c("Date","Zspread","Price")
mbs4.5 <- mbstrimlast[,c("Date",ZSpread="FN4.5sprd",Price="FN4.5px")]
names(mbs4.5) <- c("Date","Zspread","Price")
mbs3$Type = c("FN3")
mbs3.5$Type = c("FN3.5")
mbs4$Type = c("FN4")
mbs4.5$Type = c("FN4.5")
mbslast = bind_rows(mbs3, mbs3.5, mbs4, mbs4.5)
mbslast <- mbslast %>% mutate(Yeartag = year(mbslast$Date))
mbslast <- mbslast %>% mutate(Qtag = quarters(mbslast$Date, abbreviate = T))
解决方案
我们可以使用tidyverse
包来使完成这个任务的代码更简洁一些。首先,我们使用gather
从宽到长进行整形,然后使用 和 创建type
列key
,grepl
最后gsub
,我们使用spread
将数据恢复为更整齐的格式。
library(tidyverse)
mbstrimlast %>%
gather(variable, value, -Date, -Yeartag, -Qrts) %>% # wide to long
# column creation
mutate(type = ifelse(grepl(pattern = 'sprd', x = variable), 'Spread', 'Price'),
key = gsub(pattern = 'sprd|px', replacement = '', x = variable)) %>%
select(-variable) %>% # remove variable column
spread(type, value) # tidier
Date Yeartag Qrts key Price Spread
1 2018-06-17 23:00:00 2018 Q2 FN3 96.35938 52.8
2 2018-06-17 23:00:00 2018 Q2 FN3.5 99.10938 67.7
3 2018-06-17 23:00:00 2018 Q2 FN4 101.64844 81.9
4 2018-06-17 23:00:00 2018 Q2 FN4.5 103.89062 87.2
推荐阅读
- cobalt - 如何开发自己的在 Cobalt 上运行的 Web 应用程序
- beautifulsoup - 我无法使用 for 循环和 BeautifulSoup 从多个 URL 中抓取表数据
- c# - (C#) 在条件下实例化,否则重用
- sql - 需要帮助来优化潜在错误的空间 SQL 查询
- performance - Foreach 循环中的嵌套 If 语句是否会增加计算复杂性,而不仅仅是线性增加?
- c# - WPF C#获取TextBlock内联元素的大小和位置
- javascript - WebStorm 2018.3:自更新以来无法编写模板文字
- sql-server - SQL 命令模式 - 无法运行命令
- mysql - 消息:类型注册表 TypeRegistry
- java - 从 Heroku 上托管的 java 应用程序运行 Heroku CLI 命令