2011-12-08 22 views
2

我就向人們展示瞭如何出行的大型數據集工作的獨特的天總數。我需要計算人們旅行的獨特天數。下表顯示了每個特定人員所獨有的ID。每個ID相關聯的是,他們在已經走過的日期 - 對某些人來說,這可能是每天一次旅行,對他人有可能是在每天多次往返(例如人「1」了4日兩趟)。我需要R做的是挑選數據集中所有人的唯一天數(例如,人1 = 2,人2 = 3,人3 = 1,人4 = 2) - 因此使用mini-下面的數據集應該是8計算的數據

ID = c(1,1,1,2,2,2,2,3,4,4,4,4) 
date = c("4th Nov","4th Nov","5th Nov","5th Nov","6th Nov","7th Nov","7th Nov","8th Nov","6th Nov","6th Nov","7th Nov","7th Nov") 
data<-data.frame(ID,date) 

上編碼的R任何建議將受到歡迎。

非常感謝。

+2

作爲邊注,它被視爲壞實踐重用在R,例如保留字數據,日期。他們已經有了分配給他們的功能。使用數據集名稱重新定義它們可能會導致令人討厭的問題。 –

+0

@PaulHiemstra:在技術上,「數據」和「日期」不會被保留,這就是爲什麼你可以分配給他們。請參閱'?Reserved'獲取真正保留字的列表。我同意在函數之後命名變量通常是不好的形式。 –

+0

我明白了,那麼我使用這個術語保留了更廣泛的意義。感謝您的評論。 –

回答

3

同樣一個任務ddply:

ddply(data, .(id), summarise, noDays = length(unique(date))) 

    ID noDays 
1 1  2 
2 2  3 
3 3  1 
4 4  2 
4

你應該與plyr包的朋友。在ddply功能使該位分析非常簡單,需要一個data.frame,根據一些標準(在這種情況下是ID)進行分割,適用的功能,並結合件intoa一個data.frame

library(plyr) 
ddply(data, .(ID), summarise, days=length(unique(date))) 
    ID days 
1 1 2 
2 2 3 
3 3 1 
4 4 2 

或者與基礎R,使用splitsapply得到一個向量與你期望的結果:

sapply(with(data, split(date, ID)), function(x)length(unique(x))) 
1 2 3 4 
2 3 1 2 
+0

嗯,我們發佈了對方几秒鐘內,完全一樣的答案。這種情況下禮儀是什麼?當我開始打字... –

+0

@PaulHiemstra你會發現從這個時間恰好的時間你還沒有公佈。我不認爲有任何單一的禮節。 – Andrie

+0

+1的回答,它是這樣一個很好的答案:)。 –

4

也有可能用從tapply基R.

with(data, tapply(date, ID, function(x) length(unique(x)))) 

作爲length(unique(x))的替代方法,您可以利用date是一個因素並計算各個級別的事實。

with(data, tapply(date, ID, function(x) nlevels(x[, drop = TRUE]))) 

獎金的想法:

爲了解決您定義了一個名爲「日期」變量的問題,請注意您可以包括矢量您的來電data.frame,像這樣。

data <- data.frame(
    ID = c(1,1,1,2,2,2,2,3,4,4,4,4), 
    date = c("4th Nov","4th Nov","5th Nov","5th Nov","6th Nov","7th Nov","7th Nov","8th Nov","6th Nov","6th Nov","7th Nov","7th Nov") 
) 

當你有很多重複的內容字符串,它往往是更好地利用它們來paste寫。您的日期字符串可以使用

paste(c(4, 4, 5, 5, 6, 7, 7, 8, 6, 6, 7, 7), "th Nov", sep = "") 

最後,如果你想要做的任何與日期的分析創造更多consisely,你會希望將它們存儲在許多日期格式之一。爲此,您最好不要打擾「th」,但將日期保存爲電腦解析容易的形式,如「dd/mm/yyyy」。然後致電strptime