R中的条件计数

时间:2013-05-17 10:18:31

标签: r

我有一个问题,希望你们中的一些人可以帮助我。我正在撰写一篇关于药物的论文以及来自并行的影响。我在R中处理这个问题,有一个Panel数据集

我需要一个变量,这个变量对于给定的原始产品是有效的 - 在给定的时间段内有多少个并行传输器。

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)的PI产品数量(PI = 1),t。所以输出就像:

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

我希望我的问题清楚明确:)

提前致谢, 亨利克

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

Roman的回答让完全你想要什么。如果您想要总结数据,这将是方便的,使用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