2015-10-25 55 views
-1

我有以下格式数据的csv文件:数据操作

2014-01-05 23:05:42 Nicole 2014-01-05 22:41:26  
2014-01-06 13:02:58 Albert 2014-01-06 11:58:14 
2014-01-08 03:04:49 Nicole 2014-01-08 02:49:58 
2014-01-08 03:04:49 Nicole 2014-01-08 02:49:58 
2014-01-08 08:26:41 Marlen 2014-01-08 05:45:08 

当第一次约会是更新日期,第二个是创造了时间。 基本上,我可以计算日期和每个人的媒体之间经过的时间量吗?

+1

请向我们展示您的期望输出。 –

+0

名称 - 日期之间的差异的平均值 – Veronica

+0

例如对于妮可是24,15,15分钟 所以我想输出数据看起来像妮可 - 18 – Veronica

回答

3

下面是使用data.table的可能实现。在这里,我们首先转换为POSIXct类,然后计算每个名称的平均分钟数。如果你喜欢,你可以添加round

library(data.table) 
setDT(df)[, `:=`(V1 = as.POSIXct(V1), V3 = as.POSIXct(V3))] 
df[, mean(difftime(V1, V3, units = "mins")), by = V2] 
#  V2    V1 
# 1: Nicole 17.98889 mins 
# 2: Albert 64.73333 mins 
# 3: Marlen 161.55000 mins 

数据

df <- structure(list(V1 = structure(c(1L, 2L, 3L, 3L, 4L), .Label = c("2014-01-05 23:05:42", 
"2014-01-06 13:02:58", "2014-01-08 03:04:49", "2014-01-08 08:26:41" 
), class = "factor"), V2 = structure(c(3L, 1L, 3L, 3L, 2L), .Label = c("Albert", 
"Marlen", "Nicole"), class = "factor"), V3 = structure(c(1L, 
2L, 3L, 3L, 4L), .Label = c("2014-01-05 22:41:26", "2014-01-06 11:58:14", 
"2014-01-08 02:49:58", "2014-01-08 05:45:08"), class = "factor")), .Names = c("V1", 
"V2", "V3"), class = "data.frame", row.names = c(NA, -5L)) 

here了解有关data.table

+0

非常感谢!现在可以工作了。最后一个问题,我怎样才能像1-2-3那样安排V2? – Veronica

+0

不知道你的意思..你可以在运行第二行时将'by'改成'keyby'。或者你可以将结果保存在一个新的对象中并添加一个行索引。像'res < - df [,mean(difftime(V1,V3,units =“mins”)),keyby = V2]'然后是'res [,indx:= .I]'。然后检查'RES' –

+0

对不起,我的意思是我怎么才能按V2值排序。例如'17.9-64.73-161.55' – Veronica

1

的类似选项使用(来自@ DavidArenburg的POST数据)dplyr一些更多的信息。我们按'V2'进行分组,使用mutate_eachsummarise将列'V1','V3'转换为POSIXct类,以获得'V1'和'V3'之间时间差的mean

library(dplyr) 
df %>% 
    group_by(V2) %>% 
    mutate_each(funs(as.POSIXct(.)), V1, V3) %>% 
    summarise(DiffMean = mean(difftime(V1, V3, units="mins"))) 

#  V2  DiffMean 
# (fctr)   (dfft) 
#1 Albert 64.73333 mins 
#2 Marlen 161.55000 mins 
#3 Nicole 17.98889 mins 
+0

谢谢!我会记住它。 – Veronica