根据日期变量创建新行

时间:2017-11-22 16:12:01

标签: r dataframe

问题

我正在处理包含“日期”变量在内的多个变量的数据。问题是我需要拥有所有变量的所有日期。 以下是我的数据框示例:

df <- data.frame(c("a","a","c","c","c"),c(15,16,0,18,95),c(0,16,0,18,95),c(2017.01,2017.02,2017.01,2017.02,2017.03))
colnames(df) <- c("PL","CDE","LIV","date")

我想创建日期为2017.03的行作为PL a的日期,并将值CDE和LIV设置为0.

我在这里给了你一个简化的例子,但我有多个PL值和多个缺失日期。 我的意思是,一个PL将有2017.01和201.05缺失,但另一个将有2017.01,2017.02,2017.03。

我尝试了什么

我尝试在2013.01到2013.53和2014.01到2014.53,...... 2017.01到2017.47创建一个array“sem”日期,然后我在PL变量和数组中创建了一个for loop “sem”我只保留变量“PL”没有的日期,我只是对数组“sem”进行cbind,变量“PL”为duplicates它本身,然后我创建变量“CDE”和“LIV”,我设置为0,finnaly我做rbind

但是这个解决方案需要太长时间我有超过38 000变量“PL”

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,OP希望创建一个数据框,其中包含2013.01至2017.47周的所有可能组合以及PL的不同值。

这需要使用来自基础R的expand.grid()或来自CJ()包的data.table交叉连接),并将结果与​​现有{{}一起使用1}}。

df
library(data.table)
# cross join (only 2 years and 5 weeks for demonstration)
mDT <- CJ(yr = 2016:2017, wk = 1:5, PL = unique(df$PL))[
  , date := yr + wk / 100][, !c("yr", "wk")]
# join with df
setDT(df)[mDT, on = .(PL, date)][
  # replace NA by 0 as requested
  is.na(CDE), CDE := 0][is.na(LIV), LIV := 0][]

帮助程序表 PL CDE LIV date 1: a 0 0 2016.01 2: c 0 0 2016.01 3: a 0 0 2016.02 4: c 0 0 2016.02 5: a 0 0 2016.03 6: c 0 0 2016.03 7: a 0 0 2016.04 8: c 0 0 2016.04 9: a 0 0 2016.05 10: c 0 0 2016.05 11: a 15 0 2017.01 12: c 0 0 2017.01 13: a 16 16 2017.02 14: c 18 18 2017.02 15: a 0 0 2017.03 16: c 95 95 2017.03 17: a 0 0 2017.04 18: c 0 0 2017.04 19: a 0 0 2017.05 20: c 0 0 2017.05 如下所示:

mDT

PL date 1: a 2016.01 2: c 2016.01 3: a 2016.02 4: c 2016.02 5: a 2016.03 6: c 2016.03 7: a 2016.04 8: c 2016.04 9: a 2016.05 10: c 2016.05 11: a 2017.01 12: c 2017.01 13: a 2017.02 14: c 2017.02 15: a 2017.03 16: c 2017.03 17: a 2017.04 18: c 2017.04 19: a 2017.05 20: c 2017.05 中的所有值都可以通过以下方式创建:

mDT
mDT <- CJ(yr = 2013:2017, wk = 1:53, PL = unique(df$PL))[
  , date := yr + wk / 100][date <= 2017.47, !c("yr", "wk")]
mDT