【发布时间】:2011-11-07 15:32:21
【问题描述】:
我的数据格式为
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 上。此代码在链接数据集上执行时的正确输出(如下所示)为每一行(天)提供了 o 次会议。
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 来获取每对 o 节点的会议次数:
contacts <- ddply(data, .(PERSON_A, PERSON_B), summarise
, CONTACTS = length(c(PERSON_A, PERSON_B)) /2
)
但是在这和我需要的结果之间对我来说是一座巨大的山。
作为结尾,我阅读了How to make a great R reproducible example? 并尽了最大努力:)
谢谢,
【问题讨论】:
-
您的输出没有意义。您发布的数据有
97行,但您的输出中meetings的总和远远超过了这一点。您很可能会重复计算一次会议,因为总和是194 -
您可能希望以更简单的方式使您的示例可重现:尝试使用
dput(yourdataframe)并粘贴结果。分别使用dput(head(yourdataframe))。