簡體   English   中英

使用基於多列的先前值填充NA

[英]Fill NA with previous value based on multiple column

我是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 w19w19 <- 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

我應該添加什么? 請幫我解決這個案子。

這可能也適合你:

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)

捕獲即時更改的值並不容易。

有時傳統的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM