用条件 LOCF 估算 NA
Imputing NA with conditional LOCF
我更新了一个新的不同问题。这次想从Oxy获取Oxy2列。
ID Oxy Y Oxy2
1 NA 2010 NA
1 0 2011 0
1 NA 2012 NA
1 1 2013 1
1 NA 2014 1
1 NA 2015 1
1 -1 2016 1
2 0 2011 0
2 NA 2012 NA
2 1 2013 1
2 -1 2014 1
3 0 2012 0
3 -1 2013 -1
3 NA 2014 NA
4 -1 2010 -1
4 1 2011 1
4 -1 2012 1
4 -1 2013 1
4 0 2014 1
4 NA 2015 1
基本上,当我的 Oxy 变量的先前值为 0 或 -1 时,我需要保留 NA(如果有的话),并将第一个 1 出现后的所有内容替换为 1。
再次感谢您的建议。
library(dplyr)
library(zoo)
df %>%
group_by(ID) %>%
mutate(Ins1=na.locf(ifelse(is.na(Ins) & lag(Ins)==0, 999, Ins), na.rm = FALSE), Ins2=na_if(Ins1, 999))
#one step version
#mutate(Ins1 = na_if(na.locf(ifelse(is.na(Ins) & lag(Ins)==0, 999, Ins), na.rm = FALSE), 999))
# A tibble: 8 x 5
# Groups: ID [2]
ID Ins Y Ins1 Ins2
<int> <int> <int> <dbl> <dbl>
1 1 0 2010 0 0
2 1 NA 2011 999 NA
3 1 1 2012 1 1
4 1 NA 2013 1 1
5 1 NA 2014 1 1
6 2 0 2011 0 0
7 2 0 2012 0 0
8 2 NA 2013 999 NA
更新:为了解决 -1 问题,我对@user12492692 在编辑中建议的内容做了一个小改动,即将 |
替换为 %in%
df %>%
group_by(ID) %>%
mutate(Ins1 = na.locf(ifelse(is.na(Ins) & lag(Ins) %in% c(0,-1), 999, Ins), na.rm = FALSE),
Ins2 = na_if(Ins1, 999))
这是另一种方法,它使用 LOCF 填充所有值,然后在零之后添加 NA:
library(dplyr)
df1 %>%
mutate(Ins_b = Ins[!is.na(Ins)][cumsum(!is.na(Ins))],
Ins_b = replace(Ins_b, is.na(Ins) & Ins_b == 0, NA))
ID Ins Y Ins_b
1 1 0 2010 0
2 1 NA 2011 NA
3 1 1 2012 1
4 1 NA 2013 1
5 1 NA 2014 1
6 2 0 2011 0
7 2 0 2012 0
8 2 NA 2013 NA
我更新了一个新的不同问题。这次想从Oxy获取Oxy2列。
ID Oxy Y Oxy2
1 NA 2010 NA
1 0 2011 0
1 NA 2012 NA
1 1 2013 1
1 NA 2014 1
1 NA 2015 1
1 -1 2016 1
2 0 2011 0
2 NA 2012 NA
2 1 2013 1
2 -1 2014 1
3 0 2012 0
3 -1 2013 -1
3 NA 2014 NA
4 -1 2010 -1
4 1 2011 1
4 -1 2012 1
4 -1 2013 1
4 0 2014 1
4 NA 2015 1
基本上,当我的 Oxy 变量的先前值为 0 或 -1 时,我需要保留 NA(如果有的话),并将第一个 1 出现后的所有内容替换为 1。
再次感谢您的建议。
library(dplyr)
library(zoo)
df %>%
group_by(ID) %>%
mutate(Ins1=na.locf(ifelse(is.na(Ins) & lag(Ins)==0, 999, Ins), na.rm = FALSE), Ins2=na_if(Ins1, 999))
#one step version
#mutate(Ins1 = na_if(na.locf(ifelse(is.na(Ins) & lag(Ins)==0, 999, Ins), na.rm = FALSE), 999))
# A tibble: 8 x 5
# Groups: ID [2]
ID Ins Y Ins1 Ins2
<int> <int> <int> <dbl> <dbl>
1 1 0 2010 0 0
2 1 NA 2011 999 NA
3 1 1 2012 1 1
4 1 NA 2013 1 1
5 1 NA 2014 1 1
6 2 0 2011 0 0
7 2 0 2012 0 0
8 2 NA 2013 999 NA
更新:为了解决 -1 问题,我对@user12492692 在编辑中建议的内容做了一个小改动,即将 |
替换为 %in%
df %>%
group_by(ID) %>%
mutate(Ins1 = na.locf(ifelse(is.na(Ins) & lag(Ins) %in% c(0,-1), 999, Ins), na.rm = FALSE),
Ins2 = na_if(Ins1, 999))
这是另一种方法,它使用 LOCF 填充所有值,然后在零之后添加 NA:
library(dplyr)
df1 %>%
mutate(Ins_b = Ins[!is.na(Ins)][cumsum(!is.na(Ins))],
Ins_b = replace(Ins_b, is.na(Ins) & Ins_b == 0, NA))
ID Ins Y Ins_b
1 1 0 2010 0
2 1 NA 2011 NA
3 1 1 2012 1
4 1 NA 2013 1
5 1 NA 2014 1
6 2 0 2011 0
7 2 0 2012 0
8 2 NA 2013 NA