将数字(年/周,例如201501)转换为下一个更大的数字-R

时间:2018-08-08 14:21:34

标签: r numeric

我有一个数据,其中一栏是年和周。

Data
201501

201501

201502

201503
201552
......
201601

201602...........
201652

201701

这里201501指2015年的第一周,而201552指2015年的最后一周。依此类推....我想将这些年/周组合隐瞒到明年的周组合中。所以201501成为201502和201552变为201601示例:

Original Data    Converted Data

201501             201502

201501             201502

201502             201503

201503             201504.......

201552             201601

201601             201602....

201652             201701

201701             201702

我可以通过加1来实现,但是一旦将其更改为2015年至2016年,它将无法使用... 反正这样做吗?

2 个答案:

答案 0 :(得分:3)

df = read.table(text = "
Data
201501
201501
201502
201503
201601
201602
201701
", header=T)

library(dplyr)

df %>%
  distinct() %>%                          # keep unique values
  mutate(ConvertedData = lead(Data)) %>%  # add lead values (i.e. next greater value) and create a look up table
  right_join(df, by="Data")               # right join your original data

#     Data ConvertedData
# 1 201501        201502
# 2 201501        201502
# 3 201502        201503
# 4 201503        201601
# 5 201601        201602
# 6 201602        201701
# 7 201701            NA

这种方法假设您的原始数据集具有正确的值顺序。

答案 1 :(得分:2)

假设数据帧Data中的df升序,则此方法使用uniquematch。首先,这是数据帧。

df <- data.frame(Data = c(201501,201501,201502,201503,201601,201602,201701))

#     Data
# 1 201501
# 2 201501
# 3 201502
# 4 201503
# 5 201601
# 6 201602
# 7 201701

接下来,我进行转换并将其绑定到原始数​​据帧。

cbind(df, Converted = with(df, unique(Data)[match(Data, unique(Data))+1]))

#     Data Converted
# 1 201501    201502
# 2 201501    201502
# 3 201502    201503
# 4 201503    201601
# 5 201601    201602
# 6 201602    201701
# 7 201701        NA

这可以通过在列中找到所有唯一值来实现。然后,它将列中的每个元素与这些唯一值匹配。最后,它添加一个,以便引用下一个最大的唯一值。