2011-11-07 67 views
0

我有一個數據格式爲分組R參數

PERSON_A PERSON_B MEET LEAVE 

,基本上說明了當PERSON_A相識時間滿足PERSON_B,他們說在此刻離開「再見」給對方。時間以秒錶示,並且在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秒的時間間隔),並存儲在數據幀摹會議的次數。在鏈接數據集上執行時,此代碼的正確輸出(如下所示)爲每行(日)提供了會議的數量。

 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?並盡我所能:)

感謝,

+0

你的輸出沒有意義。你發佈的數據有97行,但你輸出中'會議'的總數遠遠超過了這個數字。你很可能重複計算一次會議,因爲總數是'194' – Ramnath

+0

你可能希望用更簡單的方法使你的例子可重現:嘗試使用'dput(yourdataframe)'並粘貼結果。分別使用'dput(head(yourdataframe))'。 –

回答

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))是第二轉換成一天的快捷方式。