问题
我正在处理包含“日期”变量在内的多个变量的数据。问题是我需要拥有所有变量的所有日期。 以下是我的数据框示例:
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”
答案 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