【发布时间】:2022-01-13 17:13:50
【问题描述】:
这个问题和这个Is there an R function for imputing missing year values, consecutively, by group?有关:
OP 要求此数据框按组估算缺失的年份值:(已经有足够的答案)
df <- data.frame(ID=c("A", "A", "A", "A",
"B", "B", "B", "B",
"C", "C", "C", "C",
"D", "D", "D", "D"),
grade=c("KG", "01", "02", "03",
"KG", "01", "02", "03",
"KG", "01", "02", "03",
"KG", "01", "02", "03"),
year=c(2002, 2003, NA, 2005,
2007, NA, NA, 2010,
NA, 2005, 2006, NA,
2009, 2010, NA, NA))
我尝试将ifelse 与lag() 或lead() 一起使用:
文字中的想法: 如果该行是 NA 则取上面的行并加 1。 如果组中只有一个 NA 行,则此方法可以正常工作。 如果有 2 个连续的 NA,那么它就会变得笨拙。
我的问题是我怎样才能让ifelse 一次调用就运行,直到所有 NA 都被替换:
我的尝试:
library(dplyr)
df %>%
group_by(ID) %>%
mutate(year= ifelse(is.na(year), lag(year)+1, year),
year= ifelse(is.na(year), lag(year)+1, year),
year= ifelse(is.na(year), lead(year)-1, year))
给予:
ID grade year
<chr> <chr> <dbl>
1 A KG 2002
2 A 01 2003
3 A 02 2004
4 A 03 2005
5 B KG 2007
6 B 01 2008
7 B 02 2009
8 B 03 2010
9 C KG 2004
10 C 01 2005
11 C 02 2006
12 C 03 2007
13 D KG 2009
14 D 01 2010
15 D 02 2011
16 D 03 2012
【问题讨论】:
-
您标记了 dplyr 但在基数中,如果 x 是您的年份向量
Reduce(function(acc,cv) if(is.na(cv)) acc + 1 else cv,x, accumulate =T) -
@SmokeyShakers 这是非常好的 SmokeyShakers。请提供答案!
标签: r if-statement dplyr