与data.frame

时间:2015-07-15 20:56:38

标签: r loops count frequency

我有一张桌子,我想

  • 将每四行分组为连续的组

  • 将每一行与前一组中的4行进行比较

实际上,我将一次使用四行作为参考集,其中将比较以下四组中的每一行。

具体地,给定组x中的行,我想要计算前一组(即组x-1)中有多少行具有小于或等于感兴趣行中的值的值。

我想为每一行做这个。

因此,我想对第二组四行(比如说5到8)中的每一行计算在第一组中具有小于或等于它的值的行数(比如第1行)到4)。然后第5行到第8行成为接下来的四行(9到12)的下一个参考组。等...

Row Values
1   1.35
2   0.71
3   1.00
4   0.07
5   0.53
6   0.12
7   0.36
8   2.03
9   3.83
10  1.30
11  2.17
12  1.71
13  1.52
14  1.27
15  0.29
16  0.05
17  0.14

结果如下:

Row Values  Count
1   1.35    
2   0.71    
3   1.00    
4   0.07    
5   0.53    1
6   0.12    1
7   0.36    1
8   2.03    4
9   3.83    4
10  1.30    3
11  2.17    4
12  1.71    3
13  1.52    1
14  1.27    0
15  0.29    0
16  0.05    0
17  0.14    1

3 个答案:

答案 0 :(得分:2)

您可以尝试(如果df是您的data.frame):

sdf<-split(df$Values,(df$Row-1)%/%4)
c(rep(NA,4),unlist(Map(f=function(x,y)
      findInterval(x,sort(y)),sdf[-1],sdf[-length(sdf)]),use.names=F))
#[1] NA NA NA NA  1  1  1  4  4  3  4  3  1  0  0  0  1

答案 1 :(得分:0)

你可以试试这个:

dat<-data.frame(row=c(1:length(z)),Values=z,ceiling=c(rep(NA,length(z))),count=c(rep(NA,length(z))))
#where z is a vector of your values.

for(x in 1:dim(dat)[1]) {
    dat$ceiling[x]<-ceiling(x/4)
    dat$count[x]<-length(which(dat$Values[dat$ceiling == (dat$ceiling[x]-1)] <= dat$Values[x]))
}

答案 2 :(得分:0)

g.insert(0, 1, temp); 功能与ceilinglapply一起使用。

  

vapply接受一个数字参数ceiling并返回一个数字向量,其中包含不小于x的对应元素的最小整数

  • 要获得所需效果,请将x除以每组中所需的行数。

    x

(假设ceiling(x/y) #where x = the row number and y = the number of rows per group 是您的data.frame):

使用df

lapply

z <- df$Values Groups <- ceiling(seq(z)/4) df$Count <- unlist(lapply(seq(z), function(x) sum(z[x] >= z[Groups == Groups[x] - 1])))

vapply

如果您想要一个命令:

df$Count <- 
  vapply(seq(z), function(x) sum(z[x] >= z[Groups == Groups[x] - 1]), integer(1))