我有一个格式为
的数据PERSON_A PERSON_B MEET LEAVE
这基本上描述了PERSON_A在MEET时间遇到PERSON_B并且他们在LEAVE时刻彼此说“再见”的情况。时间以秒表示,http://pastie.org/2825794(simple.dat)上有一小部分数据。
我需要的是计算按天分组的会议数量。目前,我有一个有效的代码,外观不美观。无论如何,我想要一个帮助,以便在反映我试图做的分组的代码中转换它,例如,使用ddply等。因此,我的主要目的是从这个案例中学习。可能在此代码中有很多关于R的良好实践的错误。
library(plyr)
data = read.table("simple.dat", stringsAsFactors=FALSE)
names(data)=c('PERSON_A','PERSON_B','MEET','LEAVE')
attach(data)
min_interval = min(MEET)
max_interval = max(LEAVE)
interval = max_interval - min_interval
day = 86400
number_of_days = floor(interval/day)
g = data.frame(MEETINGS=c(0:number_of_days)) # just to store the result
g[,1] = 0
start_offset = min_interval # start of the first day
for (interval in c(0:number_of_days)) {
end_offset = start_offset + day
meetings = (length(data[data$MEET >= start_offset & data$LEAVE <= end_offset, ]$PERSON_A) + length(data[data$MEET >= start_offset & data$LEAVE <= end_offset, ]$PERSON_B))
g[interval+1, ] = meetings
start_offset = end_offset # start next day
}
g
此代码遍历日期(间隔86400秒)并在数据帧g上存储会议数。在链接数据集上执行时,此代码的正确输出(如下图所示)为每一行(日)提供会议数量。
MEETINGS
1 38
2 10
3 16
4 18
5 24
6 6
7 4
8 10
9 28
10 14
11 22
12 2
13 .. 44 0 # I simplified the output here
45 2
无论如何,我知道我可以使用ddply来获得每对节点的会议数量:
contacts <- ddply(data, .(PERSON_A, PERSON_B), summarise
, CONTACTS = length(c(PERSON_A, PERSON_B)) /2
)
但在我和我需要的结果之间有一个巨大的山丘。
作为最后一点,我读了How to make a great R reproducible example?并尽我所能:)
谢谢,
答案 0 :(得分:4)
试试这个:
> d2 <- transform(data, m = floor(MEET/86400) + 1, l = floor(LEAVE/86400) + 1)
> d3 <- subset(d2, m == l)
> table(d3$m) * 2
1 2 3 4 5 6 7 8 9 10 11 12 45
38 10 16 18 24 6 4 10 28 14 22 2 2
floor(x/(60*60*24))
是将第二种转换为白天的快捷方式。