我想用dplyr解决以下问题。最好用一个窗口函数。我有一个 Dataframe 与房屋和购买价格。下面是一个例子:
houseID year price
1 1995 NA
1 1996 100
1 1997 NA
1 1998 120
1 1999 NA
2 1995 NA
2 1996 NA
2 1997 NA
2 1998 30
2 1999 NA
3 1995 NA
3 1996 44
3 1997 NA
3 1998 NA
3 1999 NA
我想创建一个像这样的 Dataframe :
houseID year price
1 1995 NA
1 1996 100
1 1997 100
1 1998 120
1 1999 120
2 1995 NA
2 1996 NA
2 1997 NA
2 1998 30
2 1999 30
3 1995 NA
3 1996 44
3 1997 44
3 1998 44
3 1999 44
以下是一些格式正确的数据:
# Number of houses
N = 15
# Data frame
df = data.frame(houseID = rep(1:N,each=10), year=1995:2004, price =ifelse(runif(10*N)>0.15, NA,exp(rnorm(10*N))))
有没有一个dplyr的方法来做到这一点?
7条答案
按热度按时间xfyts7mz1#
tidyr::fill
现在让这变得非常简单:yk9xbfzb2#
这些都使用zoo包中的
na.locf
。还要注意的是,na.locf0
(也在zoo中定义)类似于na.locf
,除了它默认为na.rm = FALSE
并且需要单个向量参数。在第一个解决方案中定义的na.locf2
也用于其他一些解决方案。死亡
给出:
这一点的变化是:
下面的其他解决方案给予了非常相似的输出,所以我们不会重复它,除非格式有很大的不同。
另一种可能性是将
by
解决方案(下面进一步显示)与dplyr组合:通过
ave
data.table
zoo此解决方案仅使用zoo。它返回宽而不是长结果:
给出:
这个解决方案可以像这样与dplyr结合:
输入
下面是用于上面示例的输入:
修订重新安排并添加了更多的解决方案。修订dplyr/zoo解决方案,以符合最新的变化dplyr。应用固定并从所有解决方案中分解出
na.locf2
。lsmepo6l3#
您可以执行
data.table
支持的滚动自连接:368yc8dk4#
纯dplyr解决方案(没有动物园)。
示例解决方案的有趣部分在df2的末尾。
t2a7ltrp5#
dplyr
和imputeTS
的组合。您也可以使用
imputeTS
中更高级的缺失数据替换(填补)函数替换na.locf
。例如na.interpolation
或na.kalman
。为此,只需将na.locf
替换为您喜欢的函数名称。tnkciper6#
没有
dplyr
:vnjpjtjt7#
从data.table v1.12.4开始,该包具有
nafill()
函数,类似于tidyr::fill()
或zoo::na.locf()
,您可以执行以下操作:还有
setnafill()
,虽然不允许 group by,但允许多列。数据来自@G. Grothendieck的回答: