我想探索仅适用于列表的第一个元素的melt
最佳data.table
方法。na.rm
measure.vars
我有一个data.table
如下:
library(data.table)
library(lubridate)
dt.master <- data.table(user = seq(1,5),
visit_id = c(2,4,NA,4,8),
visit_date = c(dmy("10/02/2018"), dmy("11/04/2018"), NA, dmy("02/03/2018"), NA),
offer_id = c(1,3,NA,NA,NA),
offer_date = c(dmy("15/02/2018"), dmy("18/04/2018"), NA, NA, NA))
与dt.master
:
user visit_id visit_date offer_id offer_date
1: 1 2 2018-02-10 1 2018-02-15
2: 2 4 2018-04-11 3 2018-04-18
3: 3 NA <NA> NA <NA>
4: 4 4 2018-03-02 NA <NA>
5: 5 8 <NA> NA <NA>
我想为每个用户获取商业活动的“故事”(即:他们的访问和他们的报价)。
dt.melted <- melt(dt.master,
id.vars = "user",
measure.vars = list(c("visit_id", "offer_id"), c("visit_date", "offer_date")),
variable.name = "level",
value.name = c("level_id", "level_date"))
与dt.melted
:
user level level_id level_date
1: 1 1 2 2018-02-10
2: 2 1 4 2018-04-11
3: 3 1 NA <NA>
4: 4 1 4 2018-03-02
5: 5 1 8 <NA>
6: 1 2 1 2018-02-15
7: 2 2 3 2018-04-18
8: 3 2 NA <NA>
9: 4 2 NA <NA>
10: 5 2 NA <NA>
但是,我不希望NA
s 出现在level_id
列中,即:
user level level_id level_date
1: 1 1 2 2018-02-10
2: 2 1 4 2018-04-11
3: 4 1 4 2018-03-02
4: 5 1 8 <NA>
5: 1 2 1 2018-02-15
6: 2 2 3 2018-04-18
不幸的是,样本的数据质量真的很差,所以level_date
并不总是可用的。因此, ana.rm = T
无效,因为我会得到:
dt.melted.na <- melt(dt.master,
id.vars = "user",
measure.vars = list(c("visit_id", "offer_id"), c("visit_date", "offer_date")),
variable.name = "level",
value.name = c("level_id", "level_date"),
na.rm = TRUE)
与dt.melted.na
:
user level level_id level_date
1: 1 1 2 2018-02-10
2: 2 1 4 2018-04-11
3: 4 1 4 2018-03-02
4: 1 2 1 2018-02-15
5: 2 2 3 2018-04-18
有没有办法na.rm = TRUE
只用于列表的第一个元素measure.vars
?我目前正在探索其他解决方法(例如在可用时填充和visit_date
使用offer_date
“错误”日期),但我想知道是否有一个优雅的解决方案。visit_id
offer_id