有两个数据框,第一个数据框缺少一些值,第二个数据框没有缺少值。规则是:
1:对于year(t) of df1
,如果缺少year(t)
的值,则使用year(t-1)*ratio
的值。 df2的ratio = value of year(t) / value of year(t-1)
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)
)
答案 0 :(得分:0)
首先,使用要替换的值创建一个新的数据框。我正在使用包data.table来做到这一点;您可以根据需要尝试使用dplyr / tidyr解决方案。然后,替换data1中的NA。因为没有每个年级和年份的数据,所以仍然会有NA。因此,将所有内容放入while循环中:
library(data.table)
while( anyNA(data1[ncol(data1)]) ) {
data1.sub <- copy(data1)
for( t in 3:ncol(data1.sub) ) set( data1.sub, j = t, value = data1[[t-1]]*(data2[[t]]/data2[[t-1]]) )
data1[ is.na(data1) ] <- data1.sub[ is.na(data1) ]
}
我用的是3:ncol(),因为X2008之前没有信息。结果如下:
> data1
grade X2008 X2009 X2010 X2011 X2012 X2013
1 1 218701 223476.9 212512.0 218529.0 186321.0 166581.8
2 2 NA 196398.0 200925.1 198933.0 170483.4 152554.2
3 3 142190 155033.0 176268.0 181134.8 155951.2 139310.5
4 4 NA NA 143699.0 159103.0 137545.8 122405.2
如果在X2008之后使用for循环到所有列,则将使用your answer中的代码来完成相同的结果:
for (i in 1:nrow(data1)) {
for (j in 3:ncol(data1)) {
if (is.na(data1[i,j])) data1[i,j] = data1[i,j-1]*data2[i,j]/data2[i,j-1]
} }
答案 1 :(得分:0)
# 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