我有一个如下所示的数据框:
df <- data.frame(project = c("A", "B"),
no_dwellings = c(150, 180),
first_occupancy = c(2020, 2019))
project no_dwellings first_occupancy
1 A 150 2020
2 B 180 2019
project
是标识住宅建筑面积的列,no_dwellings
表示这些地区最终 build 的住宅数量,以及 first_occupancy
是对第一批居民何时开始搬入新建公寓的估计。我需要将这些信息整合到人口预测中。我们得到的最佳估计是,每年(从
first occupancy
开始),有 60 套住宅正在搬入。因此,我需要依次生成组合来自 first_occupancy
的信息的列。和 no_dwellings
指出每年可能搬入的住宅数量。由于 build 的住宅数量不一定要除以 60,所以余数需要放入相应项目的最后一列。这是我希望我的数据框看起来像进一步处理的样子:
project no_dwellings first_occupancy year_2019 year_2020 year_2021 year_2022
1 A 150 2020 0 60 60 30
2 B 180 2019 60 60 60 0
最佳答案
使用 data.table
-package 您可以按如下方式处理此问题:
library(data.table)
setDT(df)[, .(yr = first_occupancy:(first_occupancy + no_dwellings %/% 60),
dw = c(rep(60, no_dwellings %/% 60), no_dwellings %% 60))
, by = .(project, no_dwellings, first_occupancy)
][, dcast(.SD, project + no_dwellings + first_occupancy ~ paste0('year_',yr), value.var = 'dw', fill = 0)]
这使:
project no_dwellings first_occupancy year_2019 year_2020 year_2021 year_2022 1: A 150 2020 0 60 60 30 2: B 180 2019 60 60 60 0
相同的逻辑适用于
tidyverse
:library(dplyr)
library(tidyr)
df %>%
group_by(project) %>%
do(data.frame(no_dwellings = .$no_dwellings, first_occupancy = .$first_occupancy,
yr = paste0('year_',.$first_occupancy:(.$first_occupancy + .$no_dwellings %/% 60)),
dw = c(rep(60, .$no_dwellings %/% 60), .$no_dwellings %% 60))) %>%
spread(yr, dw, fill = 0)
关于r - 基于多个现有列顺序生成列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49106338/