我是R的新手。
目前,我正在使用dplyr软件包来处理数据。 但是当我想进行如下计算时,我陷入了困境:
library(dplyr)
w18 <- c(1,2,3,4,5)
w19 <- c(10,10,NA,NA,NA)
temp_df <- data.frame(w18,w19)
我希望NA将替换为w19 <- ifelse(is.na(w19), lag(w19)+ lag(w18) else w19
中的值
当我尝试使用以下代码时,如何:
w19_function <- function(temp_df) {
isna <- is.na(temp_df)
lag_w19 <- tail(temp_df[!isna],1)
loc <- length(w18[!is.na(w18),])
temp_df[isna] <- lag_w19+ temp_df[loc,'w18']
return(temp_df)
}
w19_function(temp_df)
我希望得到这样的结果:
w18,w19
1,10
2,10
3,12
4,15
5,19
但是给出结果的代码:
w18,w19
1,10
2,10
3,12
4,12
5,12
我应该添加什么?请帮助我解决这个问题。
答案 0 :(得分:3)
这可能也适合您:
library(tidyverse)
w18 <- c(1,2,3,4,5)
w19 <- c(10,10,NA,NA,NA)
temp_df <- data.frame(w18,w19)
temp_df
temp_df %>%
mutate(step = cumsum(if_else(is.na(w19), lag(w18), 0))) %>%
fill(w19) %>%
mutate(w19 = w19 + step) %>%
select( -step)
# w18 w19
# 1 1 10
# 2 2 10
# 3 3 12
# 4 4 15
# 5 5 19
(已修改:带有重复)
temp_df %>%
mutate(grp = cumsum(if_else(!is.na(w19) & is.na(lag(w19)), 1, 0))) %>%
group_by(grp) %>%
mutate(step = cumsum(if_else(is.na(w19), lag(w18), 0))) %>%
fill(w19) %>%
mutate(w19 = w19 + step) %>%
ungroup() %>%
select( -step, -grp)
答案 1 :(得分:1)
捕获动态更改的值并不容易。
有时候传统的for
循环会有所帮助
for (i in seq_len(nrow(temp_df))) {
if(is.na(temp_df$w19[i])) {
temp_df$w19[i] <- temp_df$w18[i-1] + temp_df$w19[i-1]
}
}
temp_df
# w18 w19
#1 1 10
#2 2 10
#3 3 12
#4 4 15
#5 5 19