无法使用dplyr lag函数填充2个相关行
我使用R和R包dplyr。 我希望在数据框中填充上一行值中缺少的值(增加1)。如果间隙为1,则效果良好,但如果有2个或更多连续缺失值,则会出现问题。 假设这里有一个数据框,对于某些行,它的值缺失无法使用dplyr lag函数填充2个相关行,r,dplyr,lag,R,Dplyr,Lag,我使用R和R包dplyr。 我希望在数据框中填充上一行值中缺少的值(增加1)。如果间隙为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
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
)
)
库(dplyr)
tmp.data%
变异(
val1=ifelse(在%c(2,4:5)中的val1%,NA,val1),
val2=val1,
)
tmp.data%
变异(
val2=ifelse(
is.na(val2),
滞后(val2)+1,
瓦尔2
)
)
解决方案1a:假设从先前缺失的值增加,连续缺失两行
使用dplyr
:
tmp.data %>%
mutate(val2 = ifelse(is.na(val2), lag(val2) + 1, val2),
val2 = ifelse(is.na(val2), lag(val2) + 1, val2))
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)
解决方案1b:假设从先前缺失的值增加,连续缺失N行
使用data.table
、zoo
和dplyr
:
tmp.data %>%
mutate(val2 = ifelse(is.na(val2), lag(val2) + 1, val2),
val2 = ifelse(is.na(val2), lag(val2) + 1, val2))
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))
尝试在“dplyr”包中使用“if_else”是否要为缺少的值填充4和5,还是要填充4和4?@kath值:4和5。我想要4和5,我的意思是从先前已增加的值中获取。更新了我的代码。这是一个非常临时的解决方案。你需要更通用的吗?是的,我需要更通用的。缺少的行可以是任意整数。解决方案1b还需要包zoo。但它确实有效。