R中数据框行中的子集

时间:2018-10-18 05:19:47

标签: r dataframe subset

我有一个包含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的值吗?

先谢谢您。

1 个答案:

答案 0 :(得分:1)

顺便说一句:在subset(DF[1:99,], ...)中,在第一个参数中使用DF[1:99,],不要再次输入ala

subset(DF[1:99,], cumsuml < inchivaluel & cumsumr < inchivaluer)

考虑如何在list中执行此操作。

  1. 第一步是将数据分解为va起点。我将从将其分为的索引列表开始:

    inds <- mapply(seq, va, c(va[-1], nrow(DF)), SIMPLIFY=FALSE)
    

    这是一个序列列表,从1:99开始,然后是100:198,依此类推。请参见str(inds)进行验证。

  2. 现在,我们可以根据每个元素的索引向量对部分数据进行子集处理:

    filts <- lapply(inds, function(ind) subset(DF[ind,], cumsuml < inchivaluel & cumsumr < inchivaluer))
    
  3. 我们现在有一个向量列表,让我们对其进行总结:

    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))