我有一个包含30行4列的数据框(即x, y, z, u
)。它在下面给出。
mydata = data.frame(x = rnorm(30,4), y = rnorm(30,2,1), z = rnorm(30,3,1), u = rnorm(30,5))
此外,我有一个序列值,它们代表数据框中的行号。
myseq = c(seq(1, 30, by = 5))
myseq
[1] 1 6 11 16 21 26
现在,我想为99行的每一段计算prob
值。
filt= subset(mydata[1:6,], mydata[1:6,]$x < mydata[1:6,]$y & mydata[1:6,]$z < mydata[1:6,]$u
filt
prob = length(filt$x)/30
prob
然后我需要为prob
,..,1:6
等计算上面的27:30
。在这里,我只有6个prob
值。所以,我可以一一做。如果我有100个值,那将很乏味。有什么方法可以计算prob
的值吗?
先谢谢您。
答案 0 :(得分:1)
顺便说一句:在subset(DF[1:99,], ...)
中,在第一个参数中使用DF[1:99,]
,不要再次输入ala
subset(DF[1:99,], cumsuml < inchivaluel & cumsumr < inchivaluer)
考虑如何在list
中执行此操作。
第一步是将数据分解为va
起点。我将从将其分为的索引列表开始:
inds <- mapply(seq, va, c(va[-1], nrow(DF)), SIMPLIFY=FALSE)
这是一个序列列表,从1:99
开始,然后是100:198
,依此类推。请参见str(inds)
进行验证。
现在,我们可以根据每个元素的索引向量对部分数据进行子集处理:
filts <- lapply(inds, function(ind) subset(DF[ind,], cumsuml < inchivaluel & cumsumr < inchivaluer))
我们现在有一个向量列表,让我们对其进行总结:
results <- sapply(filts, function(filt) length(filt$cumsuml)/length(alpha))
最重要的是,它有助于考虑如何将这个问题分解为列表,例如http://stackoverflow.com/a/24376207/3358272上的示例。
顺便说一句:我们不必在最初创建索引列表,而是可以在第一步中分解数据,ala
DF2 <- mapply(function(a,b) DF[a:b,], va, c(va[-1], nrow(DF)), SIMPLIFY=FALSE)
filts <- lapply(DF2, function(x) subset(x, cumsuml < inchivaluel & cumsumr < inchivaluer))
results <- sapply(filts, function(filt) length(filt$cumsuml)/length(alpha))