【问题标题】:How to add columns for months in a dataframe at specific locations如何在特定位置的数据框中添加几个月的列
【发布时间】:2017-09-28 08:28:21
【问题描述】:

我有一个如下所示的数据框:

CONTRACT_ID START_DATE SERVICE  VALUE   year    month
1           01-01-2018    A      10     2018      1
2           01-01-2018    B      20     2018      1
3           01-01-2018    C      30     2018      1
4           01-03-2018    B      40     2018      3
5           01-03-2018    C      50     2018      3
6           01-03-2018    A      60     2018      3

我已经把它转换成这样的形式:

CONTRACT_ID year SERVICE 1  3
1           2018    A    10 NA
2           2018    B    20 NA
3           2018    C    30 NA
4           2018    B    NA 40
5           2018    C    NA 50
6           2018    A    NA 60

像这样使用重塑功能:

reshape(df, idvar = c("year","CONTRACT_ID","SERVICE"), timevar = "month", direction = "wide")

问题在于,在我当前的数据框中,我在某些月份没有数据,就像我们在这里看到的 2(2 月)一样。但我想为所有缺失的月份添加列,例如:

CONTRACT_ID year SERVICE 1  2  3
1           2018    A    10 NA NA
2           2018    B    20 NA NA
3           2018    C    30 NA NA
4           2018    B    NA NA 40
5           2018    C    NA NA 50
6           2018    A    NA NA 60

我如何做到这一点。我知道我可以在中间和最后添加列,但它似乎效率不高。我正在创建一个脚本,我希望它高效且耗时更少。

编辑: 根据下面评论中的建议,我使用spread 函数来扩大数据范围。 但是,如果我保留drop = False,则代码会将所有组合作为输出,这会显着增加表的大小。如果我将其设为 TRUE,它不会创建组合,但它还会删除当前数据中我没有数据的 Month 列。我想保留列,但不保留不存在的 CONTRACT_ID、DATE、SERVICE 的组合。最初我在后续步骤中删除了这些行,但现在表的大小已经大大增加,我需要在进行数据传播时处理它。 有什么建议么。

【问题讨论】:

  • 我是否需要添加一个新问题,因为我一直试图找到解决此问题的方法但失败了......现在我的想法已经不多了。

标签: r dataframe reshape transpose tidyr


【解决方案1】:

试试这个。

library(tidyr)
long_data <- read.table(header=TRUE, text='
CONTRACT_ID START_DATE SERVICE  VALUE   year    month
1           01-01-2018    A      10     2018      1
                           2           01-01-2018    B      20     2018      1
                           3           01-01-2018    C      30     2018      1
                           4           01-03-2018    B      40     2018      3
                           5           01-03-2018    C      50     2018      3
                           6           01-03-2018    A      60     2018      3
                           ')
long_data
long_data$month <- factor(long_data$month, levels = 1:12, ordered = TRUE)
spread(long_data, key = month, value = VALUE, fill = NA, drop = FALSE)

【讨论】:

  • 我还有一个问题:如果我保留drop = False,代码会将所有组合作为输出,这会显着增加表的大小。如果我将其设为 TRUE,它不会创建组合,但它也会删除我没有数据的月份列。我想保留列,但不保留不存在的 CONTRACT_ID、DATE、SERVICE 的组合。最初我在后续步骤中删除了这些行,但现在表的大小已经大大增加,我需要在进行数据传播时处理它。任何建议。
猜你喜欢
  • 2013-04-21
  • 2018-11-27
  • 1970-01-01
  • 2018-05-03
  • 2021-08-25
  • 1970-01-01
  • 2013-01-27
  • 2018-05-29
  • 2011-02-25
相关资源
最近更新 更多