r - 如何使用 df2(t)/df2(t-1) 的比率轻松填写 df1(at time t) 的缺失值?
问题描述
有两个数据框,第一个有一些缺失值,第二个没有缺失值。规则是:
1:对于year(t) of df1
,如果year(t)
缺少 的值,则使用 的值year(t-1)*ratio
。ratio = value of year(t) / value of year(t-1)
df2的
2:在df1中,2012年和2013年都没有数据,但我们只需要对2012年的缺失进行插补,即比最近的数据晚一年。我们不必多年来都推算。
我的方法有点笨。任何人都可以有更好的方法来解决这个问题?
data2 = data.frame('population by age' = seq(5, 8, by = 1),
'2008' = c(145391,
140621,
136150,
131944
),
'2009' = c(148566,
143943,
139367,
135083
),
'2010' = c(152330,
147261,
142555,
138172
),
'2011' = c(156630,
151387,
146491,
141905
),
'2012' = c(133545,
129737,
126124,
122678
),
'2013' = c(119397,
116093,
112666,
109174))
data1 <- data.frame('grade' = seq(1, 4, by = 1),
'2008'= c(218701,
NA,
142190,
NA),
'2009' = c(NA,
196398,
155033,
NA),
'2010' = c(212512,
NA,
176268,
143699),
'2011' = c(218529,
198933,
NA,
159103),
'2012' = c(NA,
NA,
NA,
NA),
'2013' = c(NA,
NA,
NA,
NA)
)
解决方案
# Find the column number of the last column with non-na value
ind <- !is.na(data1)
t1 <- tapply(data1[ind], col(data1)[ind],tail, 1)
last_non_na_col <- as.numeric(tail(unlist(dimnames(t1)), n = 1))
for (i in 1:nrow(data1)) {
for (j in 3:(last_non_na_col+1)) {
if (is.na(data1[i,j])) {
data1[i,j] = data1[i,j-1]*data2[i,j]/data2[i,j-1]
}
}
}
输出将是这样的。这正是我想要的。
> data1
grade X2008 X2009 X2010 X2011 X2012 X2013
1 1 218701 223476.9 212512.0 218529.0 186321.0 NA
2 2 NA 196398.0 200925.1 198933.0 170483.4 NA
3 3 142190 155033.0 176268.0 181134.8 155951.2 NA
4 4 NA NA 143699.0 159103.0 137545.8 NA
推荐阅读
- jdbc - 使用 groovy 和 dynamoDB 直接连接查询
- c - 使用管道()从多个子进程中读取?
- java - 检测引导程序/扩展类加载器加载的类的正确方法是什么?
- flutter - 如何使用回调从子小部件中获取更新的值,而无需在父小部件中调用 setState()?
- visual-studio - 为什么我在 VS Code 的同一位置看到 2 个编译器?
- python - 如何在python中向前和向后移动机器人直到执行停止
- android - 自定义 gradle 插件中的循环依赖
- java - 使用 JPA Criteria API 在 JOIN 查询中反转类型
- c++ - wxWidgets:图像面板中的帧大小没有改变
- flutter - 使用 SvgPicture.assets 加载图片时出现颤振问题