在R中填写错过的日期
我有以下数据框:在R中填写错过的日期,r,date,dplyr,data-manipulation,R,Date,Dplyr,Data Manipulation,我有以下数据框: df <- structure(list(Jmbg = c("0402977385033", "0402977385033", "0402977385033", "0402977385033", "0402977385033", "0402977385033", "0402977385033", "0402977385033", "0402977385033", "0402977385033", "0402977385033", "0402977385033", "
df <- structure(list(Jmbg = c("0402977385033", "0402977385033", "0402977385033",
"0402977385033", "0402977385033", "0402977385033", "0402977385033",
"0402977385033", "0402977385033", "0402977385033", "0402977385033",
"0402977385033", "0402977385033", "0402977385033", "0402977385033",
"0402977385033", "0402977385033", "0402977385033", "2607954335134",
"2607954335134", "2607954335134", "2607954335134", "2607954335134"
), DatumOd = structure(c(11260, 11457, 11503, 11603, 11696, 11826,
11875, 12013, 12043, 12133, 12225, 12225, 12317, 12408, 12499,
13878, 14425, 16203, 10915, 11687, 12372, 13878, 15217), class = "Date"),
DatumDo = structure(c(11455, 11502, 11520, 11695, 11800,
11941, 12012, 12042, 12132, 12224, 12225, 12316, 12407, 12498,
13877, NA, NA, NA, 11686, 12371, 13877, NA, NA), class = "Date")), row.names = c(NA,
-23L), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), vars = list(
Jmbg), drop = TRUE, indices = list(0:17, 18:22), group_sizes = c(18L,
5L), biggest_group_size = 18L, .Names = c("Jmbg", "DatumOd",
"DatumDo"), labels = structure(list(Jmbg = c("0402977385033",
"2607954335134")), row.names = c(NA, -2L), class = "data.frame", vars = list(
Jmbg), drop = TRUE, indices = list(c(0L, 2L, 3L, 4L, 5L,
6L, 8L, 9L, 10L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 22L),
c(1L, 7L, 11L, 20L, 21L)), group_sizes = c(18L, 5L), biggest_group_size = 18L, .Names = "Jmbg"))
但是该id应该有下一个日期从DatumOd
列开始,而不是测试。例如,对于最后一个“测试”,应该有日期2011-08-30。
当然,您可以使用任何其他包(data.table…下面是使用
data.table
的答案。它使用shift
函数查找每行的前导日期(减去一天),并按id将其分配给一个新列dayBeforeNext
。然后,ifelse
根据DatumDo
中是否已有日期,将新日期分配给另一个新变量
在分配日期之前,我需要将日期转换为字符,然后再返回到日期,因为在ifelse
语句中,通过引用data.table
来分配日期类型似乎存在错误
setDT(df)
df[, dayBeforeNext := as.character(shift(DatumOd, type='lead')-1), by=Jmbg]
df[, DatumDo := as.character(DatumDo)]
df[, new := ifelse(is.na(DatumDo), dayBeforeNext, DatumDo)]
df[, new := as.Date(new)]
新的`data.table将有额外的列,因此您可以根据需要重新分配/删除这些列。类似的内容?我认为这不是同一个问题,因为我必须使用来自两列的信息,而不是像您链接的示例中那样仅使用一列。无法在我的机器上复制此信息datees格式存在一些问题。我使用dplyr成功地找到了解决方案:
df_2%dplyr::group_by(Jmbg)%%>%dplyr::mutate(novi_date=ifelse(is.na(DatumDo)&DatumOd!=max(DatumOd),dplyr::lead(as.numeric(DatumOd),1L,order_by=as.numeric(DatumOd))-1,as.numeric(DatumDo)))%%>%dplyr::arrange(Jmbg,DatumOd)df_2$novi_在我的答案或我提到的问题中的日期格式存在问题?是的,如果我使用了您的代码,则日期格式存在一些问题。变量DatumDo
小于DatumOd
,即使我在换档功能中使用了超前而不是滞后。
setDT(df)
df[, dayBeforeNext := as.character(shift(DatumOd, type='lead')-1), by=Jmbg]
df[, DatumDo := as.character(DatumDo)]
df[, new := ifelse(is.na(DatumDo), dayBeforeNext, DatumDo)]
df[, new := as.Date(new)]