如何在特定位置的数据框中添加月份列
How to add columns for months in a dataframe at specific locations
我有一个如下所示的数据框:
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(二月)一样。但我想为所有缺失的月份添加列,例如:
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
代码将所有组合作为输出,这会显着增加 table 大小。如果我将其设置为 TRUE,它不会创建组合,但还会删除当前数据中我没有数据的月份列。我想保留列,但不保留不存在的 CONTRACT_ID、DATE、SERVICE 的组合。最初我在后续步骤中删除了这些行,但现在 table 的大小增加了很多,我需要在传播数据时处理它。
有什么建议么。
试试这个。
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)
我有一个如下所示的数据框:
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(二月)一样。但我想为所有缺失的月份添加列,例如:
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
代码将所有组合作为输出,这会显着增加 table 大小。如果我将其设置为 TRUE,它不会创建组合,但还会删除当前数据中我没有数据的月份列。我想保留列,但不保留不存在的 CONTRACT_ID、DATE、SERVICE 的组合。最初我在后续步骤中删除了这些行,但现在 table 的大小增加了很多,我需要在传播数据时处理它。
有什么建议么。
试试这个。
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)