【问题标题】:Flip Dataframe in R based on Dates?基于日期翻转R中的数据框?
【发布时间】:2020-02-20 20:34:33
【问题描述】:

我有一个,格式如下。

REGION BASIS_LOCATION CURVE_DATE    CONTRACT_BEGIN CONTRACT_END   FP
       x       y      2015-12-30    2016-02-01     2016-02-29     2
       x       y      2016-01-01    2016-02-01     2016-02-29     3

我需要做的是翻转表格,所以输出如下

REGION BASIS  LOCATION  Date          2015-12-30   2016-01-01 
x              y        2016-02-01       2          3
x              y          .              .          .
x              y          .              .          .
x              y          .              .          .
x              y        2016-02-29       2          3

尝试在 中完成。感谢您提供任何帮助。

【问题讨论】:

    标签: dataframe r r dataframe data-manipulation


    【解决方案1】:

    我们可以使用map2在'BEGIN'、'END'列之间创建一个'Date'序列,然后unnest来扩展数据集

    library(dplyr)
    library(tidyr)
    library(purrr)
    library(lubridate)
    df1 %>% 
        mutate_at(vars(starts_with('CONTRACT')), ymd) %>% 
        mutate(DATE = map2(CONTRACT_BEGIN, CONTRACT_END, seq, by = 'day')) %>%
        pivot_wider(names_from = CURVE_DATE, values_from = FP) %>% 
        select(-c(CONTRACT_BEGIN, CONTRACT_END)) %>%
        unnest(c(DATE))
    # A tibble: 29 x 5
    #   REGION BASIS_LOCATION DATE       `2015-12-30` `2016-01-01`
    #   <chr>  <chr>          <date>            <int>        <int>
    # 1 x      y              2016-02-01            2            3
    # 2 x      y              2016-02-02            2            3
    # 3 x      y              2016-02-03            2            3
    # 4 x      y              2016-02-04            2            3
    # 5 x      y              2016-02-05            2            3
    # 6 x      y              2016-02-06            2            3
    # 7 x      y              2016-02-07            2            3
    # 8 x      y              2016-02-08            2            3
    # 9 x      y              2016-02-09            2            3
    #10 x      y              2016-02-10            2            3
    # … with 19 more rows
    

    数据

    df1 <- structure(list(REGION = c("x", "x"), BASIS_LOCATION = c("y", 
    "y"), CURVE_DATE = c("2015-12-30", "2016-01-01"),
    CONTRACT_BEGIN = c("2016-02-01", 
    "2016-02-01"), CONTRACT_END = c("2016-02-29", "2016-02-29"), 
        FP = 2:3), class = "data.frame", row.names = c(NA, -2L))
    

    【讨论】:

    • 这看起来很有效。除了值显示为 。有关如何解决此问题的任何建议?
    • @TimBatten 只是一个tbl_df 打印输出方式。如果您想将其更改为 data.frame,只需在最后执行 %&gt;% as.data.frame
    • 即使我转换为数据帧,我仍然在输出中得到相同的
    • 警告信息:FP 中的值不是唯一标识的;输出将包含列表列。 * 使用values_fn = list(FP = list) 禁止此警告。 * 使用values_fn = list(FP = length) 确定重复出现的位置 * 使用values_fn = list(FP = summary_fun) 汇总重复
    • @TimBatten 是tbl_df的打印属性。如果您转换为data.frame,它将消失(因为我无法复制它)
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多