首页 > 解决方案 > R中数据框行中的子集

问题描述

我有一个包含 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

现在,我想计算prob99 行的每个段的值。

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

然后我需要计算上面prob1:6,..,27:30等等。在这里,我只有 6 个prob值。所以,我可以一一做。如果我有 100 个值,那将是乏味的。有什么方法可以计算这些prob值吗?

先感谢您。

标签: rdataframesubset

解决方案


顺便说一句:在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、 then100: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))

推荐阅读