首页 > 解决方案 > 有效地将多个列对绑定到 1 列中

问题描述

我已经按照我的需要配置了数据,但它需要 15 行代码。我确信它可以在 1 或 2 内完成,我希望在这方面做得更好的人可以教我如何做。这里是...

我有一个包含 11 个变量的表,其中包含一个日期、4 对价差和价格观察值,然后是与数据列对应的年份和季度。4对数据分别对应不同的TBA抵押券(3%、3.5%、4%、4.5%)。

mbstrimlast 表

我需要将 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)) 

标签: r

解决方案


我们可以使用tidyverse包来使完成这个任务的代码更简洁一些。首先,我们使用gather从宽到长进行整形,然后使用 和 创建typekeygrepl最后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

推荐阅读