【发布时间】:2019-07-08 07:29:42
【问题描述】:
我将 R 与 data.table 包一起使用。 我有一个计算计数的循环,但由于它是一个循环,它非常慢。现在我想以某种方式对其进行更改,这样就不需要几天的时间来计算。
我有一个数据集,我想计算此人出现在数据集中的频率。当名字、姓氏和出生日期(生日、出生月份和出生年份)相同时,它就是同一个“人”。但是,我遇到的问题是,日期也很重要。因此,如果我正在查看的这个人出现在数据集中,我必须检查“同一个人”的日期是否早于我正在查看的人的日期。因此,在我正在看的人之前,必须知道同一个人。
然后我还想计算这些条目之间的平均时间。 这是我目前的解决方案(有效但速度非常慢):
library(data.table)
data <- data[order(-persondatetime)]
vec_countperson <- numeric(nrow(data))
vec_time <- numeric(nrow(data))
for (i in 1:nrow(data)){
vec_countperson[i] <- data[firstname == data[i, firstname] &
surname == data[i, surname] &
birthdate == data[i, birthdate] &
persondatetime < data[i, persondatetime], .N]
vec_time[i] <- data[firstname == data[i, firstname] &
surname == data[i, surname] &
birthdate == data[i, birthdate] &
persondatetime < data[i, persondatetime],
mean(abs(diff(c(persondatetime, data[i, persondatetime]))))]
}
data[, countperson := vec_countperson]
data[, timebetweenentries := vec_time]
示例 data.table 如下所示:
data <- data.table(
firstname = c("Paul", "Jens", "Jens", "Jens","Paul", "Dieter"),
surname = c("Mueller", "Mustermann", "Mustermann", "Mustermann", "Mueller", "Brian"),
birthdate = as.Date(c("1960-05-08", "1960-05-08", "1960-05-08",
"1960-05-08", "1960-05-08", "1960-05-08")),
persondatetime = as.POSIXct(c("2018-05-01 23:18:38 CET", "2018-03-01 23:18:38 CET",
"2018-06-01 23:18:38 CET", "2018-04-01 23:18:38 CET",
"2018-04-06 23:18:38 CET", "2018-04-08 23:18:38 CET")))
预期的输出是:
firstname surname birthdate persondatetime countperson timebetweenentries
1: Jens Mustermann 1960-05-08 2018-03-01 23:18:38 0 NaN
2: Jens Mustermann 1960-05-08 2018-04-01 23:18:38 1 30.95833
3: Paul Mueller 1960-05-08 2018-04-06 23:18:38 0 NaN
4: Dieter Brian 1960-05-08 2018-04-08 23:18:38 0 NaN
5: Paul Mueller 1960-05-08 2018-05-01 23:18:38 1 25.00000
6: Jens Mustermann 1960-05-08 2018-06-01 23:18:38 2 45.97917
您对如何避免循环有任何想法吗?我想过其他的想法,但我的问题总是日期的问题!
【问题讨论】:
-
你可能想使用非等自连接:
data[, countpax := data[data, on=.(firstname, surname, birthday, birthmonth, birthyear, persondatetime<persondatetime), .N, by=.EACHI]] -
也许您正在寻找每个组的价值数量。
setDT(df)[, countperson := .N, by = list(firstname, surname, birthday, birthmonth, birthyear, persondatetime)]?
标签: r performance count data.table