2012-02-05 69 views
0

G'day全部,通過數據組內的數據訪問數量?

我在R.的工作對不起,這是一個非常基本的問題,但我有點卡住了。 我有一個存在/缺席點數數據的數據集,包括日期和點數(見下文)。我想最終創建一個data.frame,它按照網格單元格編號整理所有計數,並每次訪問一個網站作爲新訪問(見下文)。我無法弄清楚如何做到這一點,所以我認爲我會採取一個更簡單的方法,併爲每條記錄創建一個訪問號碼的列。因此,根據每個網站組內的訪問日期,該列會給出每條記錄的編號(請參見下文)。我無法弄清楚如何做到這一點! 任何幫助將是偉大的,先謝謝你。

親切的問候, 亞當

我有這樣的:

Site date 
1 12/01/2000 
1 24/02/2000 
1 13/08/2001 
2 14/01/2000 
2 21/01/2002 
3 1/01/1999 
3 21/04/2000 

最終要這樣:

Site   vist1    v2     v3 
1    12/01/2000   24/02/2000   13/08/2001 
2    14/01/2000   21/01/2002   na 
3    01/01/1999   21/04/2000   na 

但是,這將是一件好事:

Site date  visit 
1  12/01/2000 1 
1  24/02/2000 2 
1  13/08/2001 3 
2  14/01/2000 1 
2  21/01/2002 2 
3  01/01/1999 1 
3  21/04/2000 2 
+0

Adam:可用的示例數據可以幫助我們很多。如果你有這些加載,你能給我們一小部分它。 'TEST_DATA =頭(數據); dput(data);'然後粘貼dput的結果。謝謝。 – Maiasaura 2012-02-05 23:54:19

+0

另請注意,在編輯窗口{}中將保留代碼/數據的格式。 – Maiasaura 2012-02-05 23:55:37

回答

1

Basical您希望將您的數據從長格式轉換爲寬格式,並且從一行中重複觀察Site。基本R功能reshape()僅用於此任務。

唯一(輕微)複雜的是,你首先需要添加標識是在Site第一,第二,第三等觀察的列(我在這裏呼籲obsNum)。通過設置timevar = "obsNum",然後可以讓reshape()知道要將哪個列放入date的每個值。

df <- read.table(text = "Site date 
1 12/01/2000 
1 24/02/2000 
1 13/08/2001 
2 14/01/2000 
2 21/01/2002 
3 1/01/1999 
3 21/04/2000", header=T, stringsAsFactors=FALSE) 

df$obsNum <- unlist(sapply(rle(df$Site)$lengths, seq)) 
reshape(df, idvar="Site", timevar="obsNum", direction="wide") 

# Site  date.1  date.2  date.3 
# 1 1 12/01/2000 24/02/2000 13/08/2001 
# 4 2 14/01/2000 21/01/2002  <NA> 
# 6 3 1/01/1999 21/04/2000  <NA> 
+0

謝謝喬希, ,這是一種享受!我一定要更深入地檢查這些功能,它們非常有用。 Regards, Adam – Adam 2012-02-06 05:28:35

0

這裏是ddplydcast另一種解決方案。

library(reshape2) 
# Convert the date column into actual dates 
df$date <- as.Date(df$date, format="%d/%m/%Y") 
# Ensure that the data.frame is sorted 
df <- df[ order(df$site, df$date), ] 

# Number the visits for each site 
df$visit <- 1 
d <- ddply(df, "Site", transform, visit=cumsum(visit)) 

# Convert to a wide format 
# (Since dcast forgets the Date type, convert it to strings 
# before and back to dates after.) 
d$date <- as.character(d$date) 
d <- dcast(d, Site ~ visit, value.var="date") 
d[,-1] <- lapply(d[,-1], as.Date) 
d 
0

這是另一個採用plyrreshape2的解決方案。

require(plyr); require(reshape2); require(lubridate) 
df <- ddply(df, .(Site), transform, visit = rank(dmy(date))) 
dcast(df, Site ~ visit, value.var = 'date')