用相邻值替换 POSIXct 系列中的 NA
Replace NA in a POSIXct serie by adjacent values
我有一个这样的数据框(但行数更多):
individ_id date_time begin end
1: NOS_4214433 2017-11-22 09:01:49 2017-11-21 11:54:59 2017-11-22 09:07:27
2: NOS_4214433 2017-11-22 09:06:49 2017-11-21 11:54:59 2017-11-22 09:07:27
3: NOS_4214433 2017-11-22 09:11:49 <NA> <NA>
4: NOS_4214433 2017-11-22 09:16:49 <NA> <NA>
5: NOS_4214433 2018-01-24 12:12:18 2018-01-24 12:08:28 2018-01-25 09:33:10
我想用 'begin' 列的第一个 NA
date_time 值和最后一个 [=23] 值填充开始和结束列中的 NA
=] NA
'end' 列的值,如下所示:
individ_id date_time begin end
1: NOS_4214433 2017-11-22 09:01:49 2017-11-21 11:54:59 2017-11-22 09:07:27
2: NOS_4214433 2017-11-22 09:06:49 2017-11-21 11:54:59 2017-11-22 09:07:27
3: NOS_4214433 2017-11-22 09:11:49 2017-11-22 09:11:49 2017-11-22 09:16:49
4: NOS_4214433 2017-11-22 09:16:49 2017-11-22 09:11:49 2017-11-22 09:16:49
5: NOS_4214433 2018-01-24 12:12:18 2018-01-24 12:08:28 2018-01-25 09:33:10
所有日期时间数据都采用 POSIX 格式,我想保持这种格式。
有没有人有解决这个问题的想法?
我相信这可以解决您的问题:
library(tidyr)
na_inds_begin <- as.numeric((is.na(df$begin)))
na_inds_end <- as.numeric((is.na(df$end)))
na_diffs_lead <- c(0, diff(na_inds_begin))
na_diffs_lag <- c(diff(na_inds_end), 0)
first_nas <- na_inds_begin == 1 & na_diffs_lead > 0
first_nas[1] <- na_inds_begin[1] == 1
last_nas <- na_inds_end == 1 & na_diffs_lag < 0
last_nas[length(last_nas)] <- na_inds_end[length(na_inds_end)] == 1
df$begin[first_nas] <- df$date_time[first_nas]
df$end[last_nas] <- df$date_time[last_nas]
df$begin[first_nas] <- df$date_time[first_nas]
df$end[last_nas] <- df$date_time[last_nas]
df <-
df %>%
fill(begin, .direction = "down") %>%
fill(end, .direction = "up")
首先,我们在begin
中的每组NA
中找到第一个NA
,在NA
中的每组中找到最后一个NA
end
中的 s。我们还需要处理 begin
中的第一个元素或 end
中的最后一个元素是 NA
的情况。然后我们只用所需的替换项替换那些元素。最后,我们向下填充每个组的其余部分 begin
,向上填充 end
。
这是结果:
> df
# A tibble: 5 x 4
individ_id date_time begin end
<chr> <dttm> <dttm> <dttm>
1 NOS_4214433 2017-11-22 09:01:49 2017-11-21 11:54:59 2017-11-22 09:07:27
2 NOS_4214433 2017-11-22 09:06:49 2017-11-21 11:54:59 2017-11-22 09:07:27
3 NOS_4214433 2017-11-22 09:11:49 2017-11-22 09:11:49 2017-11-22 09:16:49
4 NOS_4214433 2017-11-22 09:16:49 2017-11-22 09:11:49 2017-11-22 09:16:49
5 NOS_4214433 2018-01-24 12:12:18 2018-01-24 12:08:28 2018-01-25 09:33:10
编辑:我更新了示例代码,以便在 begin
和 end
具有不同的 NA
索引或 first/last 元素是 [=12] 的情况下保持稳健=].
我有一个这样的数据框(但行数更多):
individ_id date_time begin end
1: NOS_4214433 2017-11-22 09:01:49 2017-11-21 11:54:59 2017-11-22 09:07:27
2: NOS_4214433 2017-11-22 09:06:49 2017-11-21 11:54:59 2017-11-22 09:07:27
3: NOS_4214433 2017-11-22 09:11:49 <NA> <NA>
4: NOS_4214433 2017-11-22 09:16:49 <NA> <NA>
5: NOS_4214433 2018-01-24 12:12:18 2018-01-24 12:08:28 2018-01-25 09:33:10
我想用 'begin' 列的第一个 NA
date_time 值和最后一个 [=23] 值填充开始和结束列中的 NA
=] NA
'end' 列的值,如下所示:
individ_id date_time begin end
1: NOS_4214433 2017-11-22 09:01:49 2017-11-21 11:54:59 2017-11-22 09:07:27
2: NOS_4214433 2017-11-22 09:06:49 2017-11-21 11:54:59 2017-11-22 09:07:27
3: NOS_4214433 2017-11-22 09:11:49 2017-11-22 09:11:49 2017-11-22 09:16:49
4: NOS_4214433 2017-11-22 09:16:49 2017-11-22 09:11:49 2017-11-22 09:16:49
5: NOS_4214433 2018-01-24 12:12:18 2018-01-24 12:08:28 2018-01-25 09:33:10
所有日期时间数据都采用 POSIX 格式,我想保持这种格式。 有没有人有解决这个问题的想法?
我相信这可以解决您的问题:
library(tidyr)
na_inds_begin <- as.numeric((is.na(df$begin)))
na_inds_end <- as.numeric((is.na(df$end)))
na_diffs_lead <- c(0, diff(na_inds_begin))
na_diffs_lag <- c(diff(na_inds_end), 0)
first_nas <- na_inds_begin == 1 & na_diffs_lead > 0
first_nas[1] <- na_inds_begin[1] == 1
last_nas <- na_inds_end == 1 & na_diffs_lag < 0
last_nas[length(last_nas)] <- na_inds_end[length(na_inds_end)] == 1
df$begin[first_nas] <- df$date_time[first_nas]
df$end[last_nas] <- df$date_time[last_nas]
df$begin[first_nas] <- df$date_time[first_nas]
df$end[last_nas] <- df$date_time[last_nas]
df <-
df %>%
fill(begin, .direction = "down") %>%
fill(end, .direction = "up")
首先,我们在begin
中的每组NA
中找到第一个NA
,在NA
中的每组中找到最后一个NA
end
中的 s。我们还需要处理 begin
中的第一个元素或 end
中的最后一个元素是 NA
的情况。然后我们只用所需的替换项替换那些元素。最后,我们向下填充每个组的其余部分 begin
,向上填充 end
。
这是结果:
> df
# A tibble: 5 x 4
individ_id date_time begin end
<chr> <dttm> <dttm> <dttm>
1 NOS_4214433 2017-11-22 09:01:49 2017-11-21 11:54:59 2017-11-22 09:07:27
2 NOS_4214433 2017-11-22 09:06:49 2017-11-21 11:54:59 2017-11-22 09:07:27
3 NOS_4214433 2017-11-22 09:11:49 2017-11-22 09:11:49 2017-11-22 09:16:49
4 NOS_4214433 2017-11-22 09:16:49 2017-11-22 09:11:49 2017-11-22 09:16:49
5 NOS_4214433 2018-01-24 12:12:18 2018-01-24 12:08:28 2018-01-25 09:33:10
编辑:我更新了示例代码,以便在 begin
和 end
具有不同的 NA
索引或 first/last 元素是 [=12] 的情况下保持稳健=].