r语言 - 展开然后填充数据框



我有2014年至2021年8年房地产租金价格的零散数据。我想扩展到一个完整的面板,以便每年每个属性都有每年的价值。这是通过将价值从一年结转到另一年来实现的。目前,每个属性都是数据帧列表中的一个条目。这个R代码创建了一些虚拟数据(df1, df2, df3),并给出了我正在寻找的结果(df4)。

year <- c(2014, 2019, 2021)
price <- c(100, 110, 120)
df1 <- data.frame(cbind(id=1, year, price))
year <- c(2016, 2019, 2021)
price <- c(200, 210, 220)
df2 <- data.frame(cbind(id=2, year, price))
year <-c (2014, 2015, 2019, 2020)
price <-c (300, 310, 320, 330)
df3 <- data.frame(cbind(id=3, year, price))
list1 <- list(df1, df2, df3)
id <- c(rep(1,8), rep(2,8), rep(3,8))
year <- c(rep(seq(2014,2021), 3))
price <- c(100, 100, 100, 100, 100, 110, 110, 120,
200, 200, 200, 200, 200, 210, 210, 220,
300, 310, 310, 310, 310, 320, 330, 330)
df4 <- data.frame(id, year, price)

所以对于属性id=1,我有2014年,2019年和2021年的数据。我会按照2014年的价格,将2015年的价格提前填充到2018年。对于属性id=2,我将在2014年和2015年用2016年回填,并将2017年至2018年用2016年前填。

我可以通过绑定列表中的所有数据帧开始,然后将其与具有所有按年份组合的id的新数据帧合并。但这不会做我想要的填充,所有缺失的id按年份组合将是NA。

我总共有大约10万个属性来完成这个任务。谢谢。

通过tidyverse查看fill()函数的功能

使用你的例子,但诱导你提到的NA,df5应该是你在这里寻找的。

library( tidyverse )
year <- c(2014, 2019, 2021)
price <- c(100, 110, 120)
df1 <- data.frame(cbind(id=1, year, price))
year <- c(2016, 2019, 2021)
price <- c(200, 210, 220)
df2 <- data.frame(cbind(id=2, year, price))
year <-c (2014, 2015, 2019, 2020)
price <-c (300, 310, 320, 330)
df3 <- data.frame(cbind(id=3, year, price))
list1 <- list(df1, df2, df3)
id <- c(rep(1,8), rep(2,8), rep(3,8))
year <- c(rep(seq(2014,2021), 3))
price <- c(100, NA, NA, NA, NA, 110, NA, 120,
NA, NA, 200, NA, NA, 210, 210, 220,
300, 310, 310, 310, 310, 320, 330, 330)
df4 <- data.frame(id, year, price)
df5 <- df4 %>% group_by( id ) %>% fill( price, .direction = "downup" )

purrr

years <- tibble(year = c(2014:2021))
list1 %>% 
map_dfr(~.x %>% 
right_join(years, by = "year") %>% 
arrange(year) %>% 
fill(id, .direction = "down") %>% 
fill(id, .direction = "up") %>% 
fill(price, .direction = "downup")) 

最新更新