使用R中的rollapply()创建频率表

时间:2014-06-12 12:20:48

标签: r apply

我有这样的数据集:

只有1个表,有2列。第一列从1到100,第二列有随机数。例如

x    y
1    25
2    51
3    0   
-    --
48   250
49   500
50   1000
-    ---       --and so on till
100  600

现在,我需要选择前50行(x = 1到x = 50)的窗口。之后我需要找到这些50 y值的范围,即y [max] -y [min] 。然后,我需要将范围除以10以创建我的频率表。在上面的例子中,范围= 1000 - 0 = 1000. 1000/10 = 100。

所以,我的频率表看起来像

0 - 100   count value of y between 0 to 100 say i(0-100)
100 - 200 count value

依此类推

900-1000  count value.

我需要将总计数值称为“总计”。在此之后,我需要取相应计数值与总计数的比率。对于第一行,它将是i(0-100)/总计。 对于第二行,它将是i(100-200)/总等等。让我们将这些值称为f。所以,f1 = i(0-100)/总; f2 = i(0-100)/总等等。

在此之后,我需要计算求和[f * ln(f)]。因此,我们的返回值是窗口从1到50的求和[f * ln(f)]。此后,我需要将此窗口滑动1个位置,这可以通过R中的roll apply()函数来实现。 / p>

您可以使用此代码开始:

library(zoo)
set.seed(1)
foo <- runif(100)
foo[c(58,59)] <- 0
rollapply(foo,width=50,FUN=function(xx){ ....})

我想要一些帮助来完成上面代码中的“function(xx){....})”。我正在努力将我所说的所有信息都放到这个小功能中。

2 个答案:

答案 0 :(得分:1)

更新后的答案...... 我希望以下内容可以帮助您...虽然它不完全是您想要的

set.seed(1)
foo <- sample(1:1000,100)

#Rolling function
rollFreq = function(x, binCount){
  temp = hist(x, breaks = binCount, plot = FALSE)
  return = temp$counts
}

rollapply(foo, width=50, FUN=rollFreq, binCount = 10)

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    4    6    2    5    6    5    8    4    5     5
 [2,]    4    6    1    5    6    5    8    4    6     5
 [3,]    4    6    1    5    6    5    8    5    5     5
 [4,]    4    6    1    5    5    5    8    6    5     5
 [5,]    4    6    1    5    4    5    8    6    5     6
 [6,]    4    6    1    5    4    5    7    6    5     7
 [7,]    4    6    1    5    4    6    7    5    5     7
 [8,]    5    5    1    5    4    6    7    5    5     7
 [9,]    5    5    1    6    4    6    7    5    4     7
[10,]    5    5    2    6    4    6    7    5    4     6
[11,]    5    6    2    6    4    5    7    5    4     6
[12,]    6    6    2    6    3    5    7    5    4     6
[13,]    6    5    2    7    3    5    7    5    4     6
[14,]    5    5    2    8    3    5    7    5    4     6
[15,]    5    6    2    8    3    5    7    5    3     6
[16,]    5    5    2    8    3    6    7    5    3     6
[17,]    4    5    2    9    3    6    7    5    3     6
[18,]    4    5    2    9    3    6    7    5    4     5
[19,]    4    5    1    9    3    6    7    5    4     6
[20,]    4    4    1   10    3    6    7    5    4     6
[21,]    4    5    1    9    3    6    7    5    4     6
[22,]    4    6    1    9    2    6    7    5    4     6
[23,]    4    6    1    9    1    6    7    5    4     7
[24,]    4    6    1   10    1    5    7    5    4     7
[25,]    4    6    1   10    1    6    7    5    3     7
[26,]    3    6    1   10    1    6    8    5    3     7
[27,]    3    6    1   10    1    5    8    5    4     7
[28,]    3    6    1   10    1    6    7    5    4     7
[29,]    4    6    1   10    1    6    6    5    4     7
[30,]    4    6    1   10    1    6    5    5    5     7
[31,]    4    6    1   10    0    6    5    6    5     7
[32,]    4    6    1   10    0    6    5    6    5     7
[33,]    5    6    1    9    0    6    5    6    5     7
[34,]    6    6    1    9    0    6    5    6    4     7
[35,]    6    6    1    9    0    6    5    6    4     7
[36,]    6    6    1    9    0    5    5    7    4     7
[37,]    6    6    1    9    0    6    5    7    4     6
[38,]    6    7    1    9    0    6    5    7    4     5
[39,]    5    7    1   10    0    6    5    7    4     5
[40,]    5    7    1   10    0    6    6    6    4     5
[41,]    5    7    1   10    0    6    5    6    4     6
[42,]    5    6    1   10    0    6    6    6    4     6
[43,]    5    6    2   10    0    6    5    6    4     6
[44,]    5    6    2   10    0    6    5    6    4     6
[45,]    5    6    3    9    0    6    5    6    4     6
[46,]    5    6    3    9    0    6    4    6    5     6
[47,]    5    7    3    9    0    6    4    5    5     6
[48,]    5    7    3   10    0    6    3    5    5     6
[49,]    5    7    4    9    0    6    3    5    5     6
[50,]    6    6    4    9    0    6    3    5    5     6
[51,]    6    6    4    8    0    6    3    6    5     6

答案 1 :(得分:1)

我可以从您的描述中得到的内容包含在以下函数中:

ff = function(x) 
{
   rg = range(x)
   f = prop.table(table(cut(x, 
                            do.call(seq, 
                                    c(as.list(rg), 
                                      list(diff(rg) / 10))))))
   sum(f * log(f))                                    
}

使用你的&#34; foo&#34;我明白了:

sapply(head(seq_along(foo), (50 - 1)), 
       function(i) ff(foo[i:(i + (50 - 1))]))
# [1] -2.247295 -2.231095 -2.240361 -2.227678 -2.239769
# [6] -2.244925 -2.239769 -2.223568 -2.246704 -2.251620
#[11] -2.238672 -2.245751 -2.251015 -2.244540 -2.244540
#[16] -2.248029 -2.235686 -2.226600 -2.258055 -2.271002
#[21] -2.278686 -2.255815 -2.251620 -2.251620 -2.231593
#[26] -2.215659 -2.207976 -2.192042 -2.192042 -2.195029
#[31] -2.194966 -2.174102 -2.168838 -2.138807 -2.118781
#[36] -2.127867 -2.127867 -2.130853 -2.130853 -2.143801
#[41] -2.173831 -2.181514 -2.163534 -2.190973 -2.167729
#[46]       NaN       NaN       NaN       NaN