如何计算这些数据的时区?
How to calculate the timezone of these data?
我有一个非常大的客户反馈数据集,我想删除重复项。
反馈如下:
Great service!, n days ago
OK, n days ago
Could be better, n days ago
Awesome, n days ago
YES!, n days ago
为了获得每个反馈的时间戳,我从文件下载到我的计算机的时间(例如 2015-07-06 EST - 5 days = 2015-07-01
)中减去 n days ago
(例如 5 days ago
)。
问题是我不知道我下载的服务器的时区,即反馈被记录的时间,所以来自同一个客户的一些相同的反馈被记录了两次。服务器已关闭,我无法访问。
示例:
Feedback, Timestamp
Great service!, 2015-07-05 00:00
Great service!, 2015-07-04 02:00
OK, 2015-04-07 09:00
OK, 2015-04-06 17:00
Could be better, 2015-08-08 01:00
Could be better, 2015-08-07 13:00
Awesome, 2015-07-10 03:00
Awesome, 2015-07-09 19:00
YES!, 2015-03-20 03:00
YES!, 2015-03-19 13:00
假设无法从服务器获取时区,是否可以根据我在此处提供的数据计算时区?我想不通,所以我希望那里的人能帮忙!
在这种情况下很难断定评论是重复的。如果您愿意将相同的 'Feedback' 视为重复项,则可以使用 dplyr
如下过滤第一行:
library(dplyr)
df <- data.frame(Feedback = c('Great service!', 'Great service!', 'OK', 'OK', 'Could be better', 'Could be better', 'Awesome', 'Awesome', 'YES!', 'YES!', 'Whatever'), Timestamp = as.POSIXct(c('2015-07-05 00:00', '2015-07-04 02:00',
'2015-04-07 09:00', '2015-04-06 17:00',
'2015-08-08 01:00', '2015-08-07 13:00',
'2015-07-10 03:00', '2015-07-09 19:00',
'2015-03-20 03:00', '2015-03-19 13:00',
'2015-04-19 01:00')), stringsAsFactors = FALSE)
df <- df %>% arrange(Feedback, Timestamp) %>% group_by(Feedback) %>% slice(1)
或者,如果你想使用某种时间增量阈值,你可以使用这样的条件 filter
:
df <- df %>% arrange(Feedback, Timestamp) %>% group_by(Feedback) %>% filter(n() == 1 | as.numeric(difftime(max(Timestamp), min(Timestamp), units = 'mins')) < 60)
如果您想计算时间增量,请按照以下方法进行操作。如您所见,它们超过了我在上面示例中使用的 60 分钟阈值:
df <- df %>% arrange(Feedback, Timestamp) %>% group_by(Feedback) %>% summarise(timedelta = as.numeric(difftime(max(Timestamp), min(Timestamp), units = 'mins')))
df
Source: local data frame [6 x 2]
Feedback timedelta
(chr) (dbl)
1 Awesome 480
2 Could be better 720
3 Great service! 1320
4 OK 960
5 Whatever 0
6 YES! 840
更新:根据下面的评论,要始终保留第一次出现,请使用以下内容:
df <- df %>% arrange(Feedback, Timestamp) %>% group_by(Feedback) %>% mutate(Timedelta = as.numeric(difftime(Timestamp, lag(Timestamp), units = 'mins'))) %>% filter(is.na(Timedelta) | Timedelta > 60) %>% select(-Timedelta)
我正在创建一个额外的列并取消选择它以使事情更容易理解。有一种方法可以将表达式组合到过滤器本身,这有点复杂。
我有一个非常大的客户反馈数据集,我想删除重复项。
反馈如下:
Great service!, n days ago
OK, n days ago
Could be better, n days ago
Awesome, n days ago
YES!, n days ago
为了获得每个反馈的时间戳,我从文件下载到我的计算机的时间(例如 2015-07-06 EST - 5 days = 2015-07-01
)中减去 n days ago
(例如 5 days ago
)。
问题是我不知道我下载的服务器的时区,即反馈被记录的时间,所以来自同一个客户的一些相同的反馈被记录了两次。服务器已关闭,我无法访问。
示例:
Feedback, Timestamp
Great service!, 2015-07-05 00:00
Great service!, 2015-07-04 02:00
OK, 2015-04-07 09:00
OK, 2015-04-06 17:00
Could be better, 2015-08-08 01:00
Could be better, 2015-08-07 13:00
Awesome, 2015-07-10 03:00
Awesome, 2015-07-09 19:00
YES!, 2015-03-20 03:00
YES!, 2015-03-19 13:00
假设无法从服务器获取时区,是否可以根据我在此处提供的数据计算时区?我想不通,所以我希望那里的人能帮忙!
在这种情况下很难断定评论是重复的。如果您愿意将相同的 'Feedback' 视为重复项,则可以使用 dplyr
如下过滤第一行:
library(dplyr)
df <- data.frame(Feedback = c('Great service!', 'Great service!', 'OK', 'OK', 'Could be better', 'Could be better', 'Awesome', 'Awesome', 'YES!', 'YES!', 'Whatever'), Timestamp = as.POSIXct(c('2015-07-05 00:00', '2015-07-04 02:00',
'2015-04-07 09:00', '2015-04-06 17:00',
'2015-08-08 01:00', '2015-08-07 13:00',
'2015-07-10 03:00', '2015-07-09 19:00',
'2015-03-20 03:00', '2015-03-19 13:00',
'2015-04-19 01:00')), stringsAsFactors = FALSE)
df <- df %>% arrange(Feedback, Timestamp) %>% group_by(Feedback) %>% slice(1)
或者,如果你想使用某种时间增量阈值,你可以使用这样的条件 filter
:
df <- df %>% arrange(Feedback, Timestamp) %>% group_by(Feedback) %>% filter(n() == 1 | as.numeric(difftime(max(Timestamp), min(Timestamp), units = 'mins')) < 60)
如果您想计算时间增量,请按照以下方法进行操作。如您所见,它们超过了我在上面示例中使用的 60 分钟阈值:
df <- df %>% arrange(Feedback, Timestamp) %>% group_by(Feedback) %>% summarise(timedelta = as.numeric(difftime(max(Timestamp), min(Timestamp), units = 'mins')))
df
Source: local data frame [6 x 2]
Feedback timedelta
(chr) (dbl)
1 Awesome 480
2 Could be better 720
3 Great service! 1320
4 OK 960
5 Whatever 0
6 YES! 840
更新:根据下面的评论,要始终保留第一次出现,请使用以下内容:
df <- df %>% arrange(Feedback, Timestamp) %>% group_by(Feedback) %>% mutate(Timedelta = as.numeric(difftime(Timestamp, lag(Timestamp), units = 'mins'))) %>% filter(is.na(Timedelta) | Timedelta > 60) %>% select(-Timedelta)
我正在创建一个额外的列并取消选择它以使事情更容易理解。有一种方法可以将表达式组合到过滤器本身,这有点复杂。