【发布时间】:2021-04-23 07:36:19
【问题描述】:
这可能很简单,但无法弄清楚。
如何在数据框dt中使用如下条件填充feature列中的NA。
填写NA的条件是:
- 如果Date的差值是
1,则用上一行的值填充NA(很容易通过tidyverse的填充功能完成)
dt_fl<-dt%>%
fill(feature, .direction = "down")
dt_fl
- 如果Date中的差值是
>1,则用之前的特征值+1填充NA,并将后面的行(特征值)替换为1增量,使特征值连续。dt_output显示了我在填充NA值并相应地替换了功能编号后对dt的期望。
dt<-structure(list(Date = structure(c(15126, 15127, 15128, 15129,
15130, 15131, 15132, 15133, 15134, 15138, 15139, 15140, 15141,
15142, 15143, 15144, 15145, 15146, 15147, 15148, 15149), class = "Date"),
feature = c(1, 1, 1, 1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA,
2, 2, 2, 2, 2, 2, NA)), row.names = c(NA, -21L), class = c("tbl_df",
"tbl", "data.frame"))
dt
dt_output<-structure(list(Date = structure(c(15126, 15127, 15128, 15129,
15130, 15131, 15132, 15133, 15134, 15138, 15139, 15140, 15141,
15142, 15143, 15144, 15145, 15146, 15147, 15148, 15149), class = "Date"),
feature = c(1, 1, 1, 1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA,
2, 2, 2, 2, 2, 2, NA), finaloutput = c(1, 1, 1, 1, 1, 1,
1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3)), row.names = c(NA,
-21L), spec = structure(list(cols = list(Date = structure(list(), class = c("collector_character",
"collector")), feature = structure(list(), class = c("collector_double",
"collector")), finaloutput = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1L), class = "col_spec"), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"))
dt_output
另外,按照 Ben 的建议,如果数据框以 NA 中的 dt2 功能开头,如何解决? dt2 的预期输出在 dt2_output 中
dt2<-structure(list(Date = structure(c(13675, 13676, 13677, 13678,
13679, 13689, 13690, 13691, 13692, 13693, 13694, 13695), class = "Date"),
feature = c(NA, NA, NA, NA, NA, 1, 1, 1, 1, 1, NA, 2)), row.names = c(NA,
-12L), class = c("tbl_df", "tbl", "data.frame"))
dt2_output<-structure(list(Date = structure(c(13675, 13676, 13677, 13678,
13679, 13689, 13690, 13691, 13692, 13693, 13694, 13695), class = "Date"),
feature = c(NA, NA, NA, NA, NA, 1, 1, 1, 1, 1, NA, 2), output_feature = c(1,
1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3)), row.names = c(NA, -12L
), spec = structure(list(cols = list(Date = structure(list(), class = c("collector_character",
"collector")), feature = structure(list(), class = c("collector_double",
"collector")), output_feature = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1L), class = "col_spec"), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"))
Ben 提供的解决方案适用于所有条件,除了dt3(下)中的 1 个条件,只是想知道为什么会这样。我的假设是第二种解决方案应该为dt3 提供dt3_expected。
dt3<-structure(list(Date = structure(c(10063, 10064, 10065, 10066,
10067, 10068, 10069, 10070, 10079, 10080, 10081, 10082, 10083,
10084, 10085, 10086, 10087, 10088, 10089), class = "Date"), feature = c(1,
1, 1, 1, 1, 1, 1, NA, NA, 2, 2, 2, 2, 2, 2, 2, 2, 2, NA)), row.names = c(NA,
-19L), class = c("tbl_df", "tbl", "data.frame"))
dt3
dt3_expected<-structure(list(Date = structure(c(10063, 10064, 10065, 10066,
10067, 10068, 10069, 10070, 10079, 10080, 10081, 10082, 10083,
10084, 10085, 10086, 10087, 10088, 10089), class = "Date"), feature = c(1,
1, 1, 1, 1, 1, 1, NA, NA, 2, 2, 2, 2, 2, 2, 2, 2, 2, NA), output_feature = c(1,
1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)), row.names = c(NA,
-19L), spec = structure(list(cols = list(Date = structure(list(), class = c("collector_character",
"collector")), feature = structure(list(), class = c("collector_double",
"collector")), output_feature = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1L), class = "col_spec"), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"))
非常感谢您的帮助,谢谢。
【问题讨论】:
-
还添加了 dt2 的预期输出。
-
谢谢 - 请查看编辑后的答案,如果这对你有用,请告诉我。
-
很棒的解决方案 Ben,但是,它在其中一种情况下不开心,我不知道为什么。我已经修改了输出与我预期不同的第 3 个条件的问题。
-
我想我可能对确定
feature值的逻辑有点困惑。在第一个dt中,NA在 2011 年 6 月 17 日变成了 2,然后在 2011 年 6 月 18 日变成了 3(即使没有日期差异)。但是,在dt3中,NA于 97 年 8 月 6 日与 97 年 8 月 7 日共享相同的output_feature2。为什么output_feature在dt3中的 8/6/97 和 8/7/97 相同,但在 2011 年 6 月 17 日和 2011 年 6 月 18 日的dt中却不相同? -
这些是空间特征,因此日期间隔不起作用。每个功能都应该 >=5 天。在 dt 中有 >5 NA 但在
dt3填充第一个值后只有 1 NA,因此它是以下功能的一部分。所以条件是:(I)如果 Date 的差异是 1,用上一行的值填充 NA(ii)如果 Date 的差异 >1 并且只有 2NA,用最后一个前一个特征和第二个填充第一个 NA首先通过以下特征和(iii)如果Date中的差异> 1,并且有超过2个NA,则用先前的特征值+1填充NA