按组用最新的非 NA 替换缺失值(NA)

By simon at 2019-05-20 • 0人收藏 • 24人看过

我想用 dplyr 解决以下问题。 最好使用窗口函数之一。 我有一个关于房屋和购买价格的数据框架。 下面是一个例子:

房屋年价11995 NA 1199610011997 NA 1199812011999 NA 21995 NA 21996 NA 21997 NA 219983021999 NA 31995 NA 319964431997 NA 31999 NA

我想做一个这样的数据框架:

1995 NA 1199610011997100119981201199912021995 NA 21996 NA 21997 NA 2199830219993031995 NA 319964431998443199944

下面是一些格式正确的数据:

# 房屋数量 n 15 # Data frame df Data.frame (houseID rep (1: n,每10) ,year 1995:2004,price ifelse (runif (10 * n)0.15,NA,exp (rnorm (10 * n)))

有没有什么方法可以做到呢?

6 个回复 | 最后更新于 2019-05-20
2019-05-20   #1

您可以做一个滚动的自连接,由数据表:

Require (data.table) setDT (df) # # change it to data.table in place setkey (df,houseID,year) # # needed for fast join df.woNA-df [ ! [ is.NA (price)] # # version without the NA rows # rolling self-join will return what you want df.woNA [ df,roll TRUE ] # will match previously past year if year not found
2019-05-20   #2

这些都是有用的不,洛克夫来自动物园的包裹:

Dplyr

图书馆(dplyr)图书馆(zoo) df%% group by (houseID)% do (na.locf (。 ,na.rm FALSE)% ungroup

给予

资料来源: 当地数据框架[15 × 3]群体: 家庭身份住房年价格111995 NA 211996100311997100411998120511999120621995 NA 721996 NA 821997 NA 921999301131995 NA 123199644131997143199844153199944

下面的其他解决方案给出的输出非常相似,所以我们不会重复它,除非格式大相径庭。

另一种可能性是将两者结合起来作者Dplyr 的溶液(如下所示) :

Df%% by (df $houseID,na.locf)% rbind all

作者

库(zoo) do.call (rbind,by (df,df $houseID,na.locf))

"ave"的变体

Library (zoo) na.locf2-function (x) na.locf (x,na.rm FALSE) transform (df,price ave (price,houseID,FUN na.locf2))

数据表

Library (data.table) library (zoo) data.table (df)[ ,na.locf (. ) ,作者: houseID ]

动物园这个解决方案单独使用 zoo。 它返回的是一个宽而不是长的结果:

Library (zoo) z-read.zoo (df,index 2,split 1,FUN identity) na.locf (z,na.rm FALSE)

给予

1231995 NA NA NA 1996100 NA 441997100 NA 441998120304419991203044

这个解决方案可以像这样与 dplyr 结合:

Library (dplyr) library (zoo) df%% read.zoo (index 2,split 1,FUN identity)% na.locf (na.rm FALSE)

输入

下面是用于上面例子的输入:

句子太长,请短一点。 名称 c ("houseID","year","price") ,类"data.frame",row.Names c (NA,-15 l))

修订本重新安排并增加了更多的解决方案。 修改 dplyr / zoo 解决方案以适应最新的变化。

2019-05-20   #3

没有Dplyr:

价格单价格单价格单价格单价格单价格单价格单年单价格单年单价格单年单价格单年单价格单年单价格单年单价格单年单价格单年单价格单年单价格单年单价格单年单价格
2019-05-20   #4

纯 dplyr 解决方案(无动物园)。

价格变化累积量(0 + ! %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

示例解决方案的一部分是在 df2的末尾。

资料来源: 当地数据框架[20x4]房屋识别年价格填充1141995 NA 2141996 NA 3141997 NA 4141998 NA 51419990.83747780.83747786142000 NA 0.8374787142001 NA 0.8374778142002 句子太长,请短一点
2019-05-20   #5

装满现在这个问题就简单多了

句子太长,请短一点
2019-05-20   #6

答:Dplyr及无罪推定组合。

图书馆(dplyr) library (imputeTS) df%% group by (houseID)% mutate (price na.locf (price,na.remaining"keep"))

你也可以替换不,洛克夫更先进的缺失数据替换(插补)函数从无罪推定. 例如不,插值或不,卡尔曼. 对于这只是取代不,洛克夫你喜欢的函数的名字。

登录后方可回帖

Loading...