用dplyr填充缺少的序列值
我有一个数据框,缺少“SNAP_ID”的值。我想用基于前一个非缺失值(lag()?)序列的浮点值填充缺失值。如果可能的话,我真的很想使用dplyr来实现这一点 假设:用dplyr填充缺少的序列值,r,dplyr,R,Dplyr,我有一个数据框,缺少“SNAP_ID”的值。我想用基于前一个非缺失值(lag()?)序列的浮点值填充缺失值。如果可能的话,我真的很想使用dplyr来实现这一点 假设: 在第一行或最后一行,我将根据数据集的最小值和最大值之间的缺失天数生成缺失日期,因此永远不会缺少数据 数据集中可能存在多个间隙 当前数据: end SNAP_ID 1 2015-06-26 12:59:00 365 2 2015-06-26 13:59:00 366 3 2015-
end SNAP_ID
1 2015-06-26 12:59:00 365
2 2015-06-26 13:59:00 366
3 2015-06-27 00:01:00 NA
4 2015-06-27 23:00:00 NA
5 2015-06-28 00:01:00 NA
6 2015-06-28 23:00:00 NA
7 2015-06-29 09:00:00 367
8 2015-06-29 09:59:00 368
我想要达到的目标:
end SNAP_ID
1 2015-06-26 12:59:00 365.0
2 2015-06-26 13:59:00 366.0
3 2015-06-27 00:01:00 366.1
4 2015-06-27 23:00:00 366.2
5 2015-06-28 00:01:00 366.3
6 2015-06-28 23:00:00 366.4
7 2015-06-29 09:00:00 367.0
8 2015-06-29 09:59:00 368.0
作为数据帧:
df <- structure(list(end = structure(c(1435323540, 1435327140, 1435363260,
1435446000, 1435449660, 1435532400, 1435568400, 1435571940), tzone = "UTC", class = c("POSIXct",
"POSIXt")), SNAP_ID = c(365, 366, NA, NA, NA, NA, 367, 368)), .Names = c("end",
"SNAP_ID"), row.names = c(NA, -8L), class = "data.frame")
@mathematic.coffee的杰出答案如下:
df %>%
arrange(end) %>%
group_by(tmp=cumsum(!is.na(SNAP_ID))) %>%
mutate(SNAP_ID=SNAP_ID[1] + 0.1*(0:(length(SNAP_ID)-1))) %>%
ungroup() %>%
select(-tmp)
编辑:新版本适用于任意数量的NA运行。 这个也不需要
zoo
首先,请注意tmp=cumsum(!is.na(SNAP_ID))
组SNAP_ID
s相同tmp
的此类组由一个非na值和一系列na值组成
然后按此变量分组,只需在第一个SNAP_ID中添加.1即可填写NAs:
df %>%
arrange(end) %>%
group_by(tmp=cumsum(!is.na(SNAP_ID))) %>%
mutate(SNAP_ID=SNAP_ID[1] + 0.1*(0:(length(SNAP_ID)-1)))
end SNAP_ID tmp
1 2015-06-26 12:59:00 365.0 1
2 2015-06-26 13:59:00 366.0 2
3 2015-06-27 00:01:00 366.1 2
4 2015-06-27 23:00:00 366.2 2
5 2015-06-28 00:01:00 366.3 2
6 2015-06-28 23:00:00 366.4 2
7 2015-06-29 09:00:00 367.0 3
8 2015-06-29 09:59:00 368.0 4
然后,您可以在之后删除tmp
列(在末尾添加%%>%select(-tmp)
)
编辑:这是旧版本,不适用于
NA
s的后续运行
如果您的目标是用以前的值+0.1填充每个NA,则可以使用zoo
的NA.locf
(用以前的值填充每个NA
),以及cumsum(is.NA(SNAP_ID))*0.1来添加额外的0.1
library(zoo)
df %>%
arrange(end) %>%
mutate(SNAP_ID=ifelse(is.na(SNAP_ID),
na.locf(SNAP_ID) + cumsum(is.na(SNAP_ID))*0.1,
SNAP_ID))
谢谢你出色的回答!唯一的小更正是,您需要在select(-tmp)之前解组()。ungroup()有时会让我发疯。
library(zoo)
df %>%
arrange(end) %>%
mutate(SNAP_ID=ifelse(is.na(SNAP_ID),
na.locf(SNAP_ID) + cumsum(is.na(SNAP_ID))*0.1,
SNAP_ID))