我有一个问题,希望你们中的一些人可以帮助我。我正在撰写一篇关于药物的论文以及来自并行的影响。我在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
我希望我的问题清楚明确:)
提前致谢, 亨利克
答案 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_ID
和t
作为分组变量。然后,在每个组中,应用一个函数,该函数返回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