【发布时间】:2018-10-23 12:16:31
【问题描述】:
我有以下数据集,其中“值”列中的值从开始到结束日期都是有效的:
data.table(company = c("A", "A", "B", "B"), person = c("a", "b", "b", "c"), value = c(2,3,5,5), start_date = c("2015-01-01", "2015-01-04", "2015-01-02", "2015-01-06"), end_date = c("2015-01-06", "2015-01-07", "2015-01-07", "2015-01-07"))
company person value start_date end_date
1: A a 2 2015-01-01 2015-01-06
2: A b 3 2015-01-04 2015-01-07
3: B b 5 2015-01-02 2015-01-07
4: B c 5 2015-01-06 2015-01-07
我想根据这个数据计算三件事:
- 每个公司每个日期的平均值
- 每个日期的公司数量
- 每个公司每个日期的人数
我尝试了以下方法,这对我的测试样本来说就像一个魅力,但它在实际数据集上失败了,因为它需要大量的计算能力。我知道这是由于制作了一个数据集,每个公司每个人每个日期都有一个单独的行,但是,我不知道如何使用 R 中的某种函数来解决这个问题。
尝试过的代码:
test$start_date = as.Date(as.character(test$start_date), format = "%Y-%m-%d")
test$end_date = as.Date(as.character(test$end_date), format = "%Y-%m-%d")
#indexing per row
indxtest = test[,.(Date=seq(from = min(start_date), to = max(end_date), by = "day")), by = 1:nrow(test)]
test = test[, nrow := 1:nrow(test)]
test = merge(indxtest, test, by = "nrow", all.x = TRUE)
setDT(test, "company","Date")
test = test[, mean_EPS := mean(value, na.rm = TRUE), by = c("company", "Date")]
test = test[, Number_people := .N, by = c("company", "Date")]
test = test[, number_companies := uniqueN(company), by = "Date"]
我目前的结果如下所示:
nrow Date company person value start_date end_date mean_value Number_people number_companies
1: 1 2015-01-01 A a 2 2015-01-01 2015-01-06 2.0 1 1
2: 1 2015-01-02 A a 2 2015-01-01 2015-01-06 2.0 1 2
3: 3 2015-01-02 B b 5 2015-01-02 2015-01-07 5.0 1 2
4: 1 2015-01-03 A a 2 2015-01-01 2015-01-06 2.0 1 2
5: 3 2015-01-03 B b 5 2015-01-02 2015-01-07 5.0 1 2
6: 1 2015-01-04 A a 2 2015-01-01 2015-01-06 2.5 2 2
7: 2 2015-01-04 A b 3 2015-01-04 2015-01-07 2.5 2 2
8: 3 2015-01-04 B b 5 2015-01-02 2015-01-07 5.0 1 2
9: 1 2015-01-05 A a 2 2015-01-01 2015-01-06 2.5 2 2
10: 2 2015-01-05 A b 3 2015-01-04 2015-01-07 2.5 2 2
11: 3 2015-01-05 B b 5 2015-01-02 2015-01-07 5.0 1 2
12: 1 2015-01-06 A a 2 2015-01-01 2015-01-06 2.5 2 2
13: 2 2015-01-06 A b 3 2015-01-04 2015-01-07 2.5 2 2
14: 3 2015-01-06 B b 5 2015-01-02 2015-01-07 5.0 2 2
15: 4 2015-01-06 B c 5 2015-01-06 2015-01-07 5.0 2 2
16: 2 2015-01-07 A b 3 2015-01-04 2015-01-07 3.0 1 2
17: 3 2015-01-07 B b 5 2015-01-02 2015-01-07 5.0 2 2
18: 4 2015-01-07 B c 5 2015-01-06 2015-01-07 5.0 2 2
除了我自己想到的解决方案之外,我在这里找不到任何相关的东西,但是,如果有参考资料会很有帮助。
【问题讨论】:
标签: r data.table