我在R中有一个数据框架,它给我每个城镇和地区的每家商店的开业和关门日期,像这样:
town <- c("A", "A", "A", "B")
opening <- as.Date(c("1900-01-01", "1905-02-05", "1906-01-01", "1910-01-01"))
closing <- as.Date(c(NA, NA, NA, "1913-03-03"))
df <- data.frame(town, opening, closing)
我想计算每个城镇每年(年底)的商店数量,将每个观察结果对应于一个城镇和一年,这样我就得到了这个:
town_final <- c("A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B")
year <- c(1900, 1901, 1902, 1903, 1904, 1905, 1900, 1901, 1902, 1903, 1904, 1905)
stores <- c(1, 1, 2, 3, 3, 3, 0, 0, 0, 1, 1, 0)
df_final <- data.frame(town_final, year, stores)
我有大量的观察结果,所以我必须用循环来做这件事,但我不确定如何正确地做到这一点。我非常感谢任何帮助。
3条答案
按热度按时间erhoui1w1#
这里有一个tidyverse解决方案,使用了一些值得了解的工具:
首先,我们为每个商店创建一个唯一的ID,清理开始和结束年份,并创建从
year_opened
到year_closed
的整数序列:然后,我们将列子集化,将列表列解嵌套为长格式,对每个城镇和年份的不同商店进行分组和计数,并进行排序:
ijnw1ujt2#
一个潜在的{tidyverse}解决方案:
这个想法本质上是检查每个商店是否在给定年份的最后一天开放,并存储为
TRUE
或FALSE
。然后按城市和年份分组,并将它们相加。这给出:这些值与您要求的输出不太匹配,但我不确定您是如何得到e的。g.根据您提供的输入数据,1903年A镇为3。
dwbf0jvd3#
这里是一个“非魔法”的解决方案(因此相对较多的代码),它可以在将来补充选择一个年的范围,以及可能的错误处理。
其想法是创建零数据框并添加“真实的”值。
输出