让我们说a有一个简单的数据框
data.frame(val=c(0, NA, NA, 2, NA, NA))
如果值为0,我如何仅传播该值以获得所需的数据帧:
data.frame(val=c(0, 0, 0, 2, NA, NA))
我更喜欢与tidyverse兼容的解决方案。
答案 0 :(得分:6)
library(zoo)
library(dplyr)
df = data.frame(val=c(0, NA, NA, 2, NA, NA))
df %>% mutate(val2 = ifelse(is.na(val) & na.locf(val) == 0, na.locf(val), val))
# val val2
# 1 0 0
# 2 NA 0
# 3 NA 0
# 4 2 2
# 5 NA NA
# 6 NA NA
然后,您可以删除原始变量并创建仅包含更新值的新数据集。
答案 1 :(得分:2)
使用fill
tidyr
的{{1}}的另一个选项,它是tidyverse
的一部分。
library(tidyverse)
dat <- data.frame(val=c(0, NA, NA, 2, NA, NA))
dat2 <- dat %>%
mutate(val2 = val) %>%
fill(val2) %>%
mutate(val = ifelse(val2 == 0, val2, val)) %>%
select(-val2)
dat2
# val
# 1 0
# 2 0
# 3 0
# 4 2
# 5 NA
# 6 NA