基于子组的R变量分组

基于子组的R变量分组,r,grouping,plyr,R,Grouping,Plyr,我有一个数据格式为 PERSON_A PERSON_B MEET LEAVE 这基本上描述了一个人在见面的时候遇到了另一个人,他们在离开的时候互相说“再见”。时间以秒表示,并且(simple.dat)上有一小部分数据 我需要的是计算每天分组的会议次数。目前,我有一个代码可以工作,外观并不漂亮。无论如何,我想要一个帮助,以便在代码中转换它,反映我试图做的分组,例如,使用ddply等。因此,我的主要目的是从这个案例中学习。关于R中的良好实践,此代码中可能有许多错误 library(plyr) da

我有一个数据格式为

PERSON_A PERSON_B MEET LEAVE
这基本上描述了一个人在见面的时候遇到了另一个人,他们在离开的时候互相说“再见”。时间以秒表示,并且(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
无论如何,我知道我可以使用ddply获得每对o节点的会议次数:

contacts <- ddply(data, .(PERSON_A, PERSON_B), summarise
 , CONTACTS = length(c(PERSON_A, PERSON_B)) /2
)
contacts试试这个:

> 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 
>d2 d3表格(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))
是一种将秒转换为天的快速方法。

试试以下方法:

> 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 
>d2 d3表格(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))
是一种将秒转换为天的快速方法。

您的输出没有意义。您发布的数据有
97行
,但输出中的
会议
总数远远超过了这一数字。您很可能会重复计算一次会议,因为总和是
194
。您可能希望以更简单的方式再现示例:尝试使用
dput(您的数据框)
并粘贴结果。分别使用
dput(head(yourdataframe))
。您的输出没有意义。您发布的数据有
97行
,但输出中的
会议
总数远远超过了这一数字。您很可能会重复计算一次会议,因为总和是
194
。您可能希望以更简单的方式再现示例:尝试使用
dput(您的数据框)
并粘贴结果。分别使用
dput(head(yourdataframe))