4

我有一个问题希望你们中的一些人能帮助我。我正在写一篇关于药品和平行进口的影响的论文。我在 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=0)时间 t 的 PI 产品数(PI=1)。所以输出会是这样的:

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

我希望我已经把我的问题说清楚了:)

提前致谢, 亨里克

4

3 回答 3

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
于 2013-05-17T10:24:45.447 回答
2

我会使用ave你的两列Product_IDt作为分组变量。然后,在每个组中,应用一个函数,该函数返回 PI 的总和,后跟适当的NAs 数:

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

data.table如果您的数据很大并且速度是一个问题,则可以对包使用相同的想法。

于 2013-05-17T10:57:43.477 回答
1

罗马的答案正是你想要的。如果你想总结数据,这会很方便,使用plyrpacakge (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
于 2013-05-17T10:30:54.327 回答