【问题标题】:Grouping R variables based on sub-groups基于子组对 R 变量进行分组
【发布时间】: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))

标签: r grouping plyr


【解决方案1】:

试试这个:

> 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)) 是一种将秒转换为日的快捷方式。

【讨论】:

    猜你喜欢
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多