2013-05-17 39 views
4

我有一個問題,我希望你們中的一些人可以幫助我。我正在撰寫關於製藥和平行進口的影響的論文。我正在處理這個R,有一個面板數據集有條件計數R

我需要一個變量,計算給定的原始產品 - 在給定的時間段內有多少個並行進口商。

Product_ID  PI  t  
    1   0  1 
    1   1  1 
    1   1  1 
    1   0  2 
    1   1  2 
    1   1  2 
    1   1  2 
    1   1  2 
    2   0  1 
    2   1  1 
    2   0  2 
    2   1  2 
    2   0  3 
    2   1  3 
    2   1  3 
    2   1  3 

理想我想在這裏什麼是新的一列,等的PI-產品(PI = 1),用於在時間的原始(PI = 0),噸數。所以輸出會是這樣:

Product_ID  PI  t  nPIcomp 
    1   0  1  2 
    1   1  1 
    1   1  1 
    1   0  2  4 
    1   1  2 
    1   1  2 
    1   1  2 
    1   1  2 
    2   0  1  1 
    2   1  1 
    2   0  2  1 
    2   1  2 
    2   0  3  3 
    2   1  3 
    2   1  3 
    2   1  3 

我希望我已經作出了明確的問題:)

由於提前, 亨裏克

+0

+1給出了一個工作示例和期望的輸出。 –

回答

3

像這樣的事情?

x <- read.table(text = "Product_ID  PI  t  
    1   0  1 
    1   1  1 
    1   1  1 
    1   0  2 
    1   1  2 
    1   1  2 
    1   1  2 
    1   1  2 
    2   0  1 
    2   1  1 
    2   0  2 
    2   1  2 
    2   0  3 
    2   1  3 
    2   1  3 
    2   1  3", header = TRUE) 

find.count <- rle(x$PI) 
count <- find.count$lengths[find.count$values == 1] 
x[x$PI == 0, "nPIcomp"] <- count 

    Product_ID PI t nPIcomp 
1   1 0 1  2 
2   1 1 1  NA 
3   1 1 1  NA 
4   1 0 2  4 
5   1 1 2  NA 
6   1 1 2  NA 
7   1 1 2  NA 
8   1 1 2  NA 
9   2 0 1  1 
10   2 1 1  NA 
11   2 0 2  1 
12   2 1 2  NA 
13   2 0 3  3 
14   2 1 3  NA 
15   2 1 3  NA 
16   2 1 3  NA 
+0

我只是想你的解決方案 - 但我並沒有完全得到解決,一路:) 我已經採取了我使用的代碼的screendump:HTTP://cl.ly/image/0q1T062M0r2T 也爲記錄:我的數據集是'IMS'Product_ID被稱爲'gid'並且PI被稱爲'pi'(當我以前寫的時候,我不記得變量的名字,我坐在工作中) 正如你可以從數據集:http://cl.ly/image/3p2I2W0M1m0f,源代碼後我沒有得到一個名爲'nPIcomp'的新變量。這是我想要的。有什麼建議麼? :) – Hbrandi

+0

@Hbrandi你不想得到一個新的變量。這應該在你的IMS對象中添加另一列。 –

+0

我試過你的例子,並且當我使用這些代碼行時,它的工作狀態非常好。但是,當我將它應用到我的真實數據集時,使用以下代碼: find.count < - rle(IMS $ pi) count <-find.count $ lengths [find.count $ values == 1] IMS [ IMS $ pi == 0,「nPIcomp」] < - count 我得到這個錯誤: 錯誤在'[< - 。data.frame'('* tmp *',IMS $ pi == 0,「nPIcomp 「,value = c(1L,:: 替換有14297行,數據有247603 – Hbrandi

1

羅馬的回答讓正是你想要什麼。如果你想總結這將是得心應手的數據,使用plyr pacakge(df是我叫你data.frame)...

ddply(df , .(Product_ID , t) , summarise , nPIcomp = sum(PI)) 
# Product_ID t nPIcomp 
#1   1 1  2 
#2   1 2  4 
#3   2 1  1 
#4   2 2  1 
#5   2 3  3 
2

我會用ave和你的兩列Product_IDt爲分組變量。然後,在每個組內,應用返回PI的隨後的NA S的適當數目之和的函數:

dat <- transform(dat, nPIcomp = ave(PI, Product_ID, t, 
            FUN = function(z) { 
             n <- sum(z) 
             c(n, rep(NA, n)) 
            })) 

同樣的想法可以用data.table包被使用,如果你的數據是大和速度是關心。

+0

這是我的第一個想法,但後來選擇了rle。 Product_IDs。鑑於面板數據,這似乎不太可能,但你永遠不知道...... –