我有这样的数据集:
只有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){....})”。我正在努力将我所说的所有信息都放到这个小功能中。
答案 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