我想用dplyr解决以下问题.最好使用其中一个窗口功能.

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

我想制作一个这样的数据框:

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方法可以做到这一点?

推荐答案

这些都使用动物园包装中的na.locf个.还要注意,na.locf0(也在zoo中定义)与na.locf类似,只是它默认为na.rm = FALSE,并且需要一个向量参数.第一个解决方案中定义的na.locf2也用于其他一些解决方案中.

dplyr

library(dplyr)
library(zoo)

na.locf2 <- function(x) na.locf(x, na.rm = FALSE)
df %>% group_by(houseID) %>% do(na.locf2(.)) %>% ungroup

给:

Source: local data frame [15 x 3]
Groups: houseID

   houseID year price
1        1 1995    NA
2        1 1996   100
3        1 1997   100
4        1 1998   120
5        1 1999   120
6        2 1995    NA
7        2 1996    NA
8        2 1997    NA
9        2 1998    30
10       2 1999    30
11       3 1995    NA
12       3 1996    44
13       3 1997    44
14       3 1998    44
15       3 1999    44

另一个变化是:

df %>% group_by(houseID) %>% mutate(price = na.locf0(price)) %>% ungroup

下面的其他解决方案给出的输出非常相似,因此我们不会重复它,除非格式有很大差异.

另一种可能性是将by溶液(如下所示)与dplyr结合使用:

df %>% by(df$houseID, na.locf2) %>% bind_rows

by

library(zoo)

do.call(rbind, by(df, df$houseID, na.locf2))

ave

library(zoo)

transform(df, price = ave(price, houseID, FUN = na.locf0))

data.table

library(data.table)
library(zoo)

data.table(df)[, na.locf2(.SD), by = houseID]

zoo此解决方案仅使用zoo.它会返回一个宽而不是长的结果:

library(zoo)

z <- read.zoo(df, index = 2, split = 1, FUN = identity)
na.locf2(z)

给:

       1  2  3
1995  NA NA NA
1996 100 NA 44
1997 100 NA 44
1998 120 30 44
1999 120 30 44

此解决方案可与dplyr组合如下:

library(dplyr)
library(zoo)

df %>% read.zoo(index = 2, split = 1, FUN = identity) %>% na.locf2

input

以下是用于上述示例的输入:

df <- structure(list(houseID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
  2L, 3L, 3L, 3L, 3L, 3L), year = c(1995L, 1996L, 1997L, 1998L, 
  1999L, 1995L, 1996L, 1997L, 1998L, 1999L, 1995L, 1996L, 1997L, 
  1998L, 1999L), price = c(NA, 100L, NA, 120L, NA, NA, NA, NA, 
  30L, NA, NA, 44L, NA, NA, NA)), .Names = c("houseID", "year", 
  "price"), class = "data.frame", row.names = c(NA, -15L))

REVISED重新安排并添加了更多解决方案.修订了dplyr/zoo解决方案,以符合dplyr的最新变化.应用固定的并从所有解决方案中计算出na.locf2个.

R相关问答推荐

如何向使用plot_smooths()函数显示的GAM结果图表中添加点?

feature_weights参数没有影响Xgboost

R中的Fasttext langue_identification返回太多参数-如何与文本匹配?

使用gggplot 2在R中重新调整面板和y轴文本大小

以R为基数排列奇数个图

如何使用R中的dhrr函数将李克特量表的因子列从长转换为宽?

随机森林回归:下拉列重要性

自动变更列表

如何在R中描绘#符号?

Ggplot2中geom_tile的动态zoom

如何在R中平滑地绘制线图(不拟合)?

按时间顺序对不同事件进行分组

R如何将列名转换为更好的年和月格式

为什么这个表格格罗布不打印?

为什么我对圆周率图的蒙特卡罗估计是空的?

如何使用字符串从重复的模式中提取多个数字?

使用来自嵌套列和非嵌套列的输入的PURRR:MAP和dplyr::Mariate

将统计检验添加到GGPUBR中的盒图,在R

随机 Select 的非NA列的行均数

抽样变换-REXP与RWEIBUR