无法使用 dplyr 滞后函数填充 2 个连续行
Can not fill 2 concecutive rows using dplyr lag function
我使用 R 和 R 包 dplyr。
我想在数据框中填充前一行值中的缺失值(将其增加 1)。如果我有一个差距,它会很好地工作,但如果有 2 个或更多连续的缺失值,那么我就有问题了。
在这里假设我有一个数据框,并且对于某些行,它的值丢失了。
id val1 val2
1 0 0 0
2 1 1 1
3 2 NA NA
4 3 3 3
5 4 NA NA
6 5 NA NA
7 6 6 6
这里 val2 是我执行增加的值,而 val1 只是原始值。
对于 NA 值,我想采用前一行值并将其增加 1。
我使用 dplyr 包和滞后函数。
这是代码:
library(dplyr)
tmp.data <- data.frame(id = c(0:6),val1 = c(0:6)) %>%
mutate(
val1 = ifelse( val1 %in% c(2,4:5),NA,val1),
val2 = val1,
)
tmp.data <- tmp.data %>%
mutate(
val2 = ifelse(
is.na(val2),
lag(val2) + 1,
val2
)
)
解决方案 1a:假设从之前的缺失值增加,连续缺失 2 行
Using dplyr
:
tmp.data %>%
mutate(val2 = ifelse(is.na(val2), lag(val2) + 1, val2),
val2 = ifelse(is.na(val2), lag(val2) + 1, val2))
解决方案 1b:假设从之前的缺失值增加,连续缺失 N 行
使用 data.table
、zoo
和 dplyr
:
setDT(tmp.data)[, consec := seq_len(.N), by=rleid(val2)]
tmp.data %>%
mutate(val2 = ifelse(is.na(val2), na.locf(val2) + consec, val2)) %>%
select(-consec)
或写在一起:
tmp.data %>%
group_by(rleid(val2)) %>%
mutate(consec = seq_along(val2)) %>%
ungroup() %>%
mutate(val2 = ifelse(is.na(val2), na.locf(val2) + consec, val2)) %>%
select(id, val1, val2)
解决方案 2:不假设从之前的缺失值增加
使用 dplyr
和 zoo
:
tmp.data %>%
mutate(val2 = ifelse(is.na(val2), na.locf(val2) + 1, val2))
我使用 R 和 R 包 dplyr。 我想在数据框中填充前一行值中的缺失值(将其增加 1)。如果我有一个差距,它会很好地工作,但如果有 2 个或更多连续的缺失值,那么我就有问题了。 在这里假设我有一个数据框,并且对于某些行,它的值丢失了。
id val1 val2
1 0 0 0
2 1 1 1
3 2 NA NA
4 3 3 3
5 4 NA NA
6 5 NA NA
7 6 6 6
这里 val2 是我执行增加的值,而 val1 只是原始值。
对于 NA 值,我想采用前一行值并将其增加 1。
我使用 dplyr 包和滞后函数。
这是代码:
library(dplyr)
tmp.data <- data.frame(id = c(0:6),val1 = c(0:6)) %>%
mutate(
val1 = ifelse( val1 %in% c(2,4:5),NA,val1),
val2 = val1,
)
tmp.data <- tmp.data %>%
mutate(
val2 = ifelse(
is.na(val2),
lag(val2) + 1,
val2
)
)
解决方案 1a:假设从之前的缺失值增加,连续缺失 2 行
Using dplyr
:
tmp.data %>%
mutate(val2 = ifelse(is.na(val2), lag(val2) + 1, val2),
val2 = ifelse(is.na(val2), lag(val2) + 1, val2))
解决方案 1b:假设从之前的缺失值增加,连续缺失 N 行
使用 data.table
、zoo
和 dplyr
:
setDT(tmp.data)[, consec := seq_len(.N), by=rleid(val2)]
tmp.data %>%
mutate(val2 = ifelse(is.na(val2), na.locf(val2) + consec, val2)) %>%
select(-consec)
或写在一起:
tmp.data %>%
group_by(rleid(val2)) %>%
mutate(consec = seq_along(val2)) %>%
ungroup() %>%
mutate(val2 = ifelse(is.na(val2), na.locf(val2) + consec, val2)) %>%
select(id, val1, val2)
解决方案 2:不假设从之前的缺失值增加
使用 dplyr
和 zoo
:
tmp.data %>%
mutate(val2 = ifelse(is.na(val2), na.locf(val2) + 1, val2))