我正在尝试将功能函数从excel(vba)移动到R,我似乎遇到了一些问题,我相信我的主要问题是" while循环"在R中工作方式不同。
我有一个混合了0和值的向量矩阵。我试图提取两个0之间的部分的最大值。这是一个示例向量:
0
1.635575602
11.93874271
15.20341137
18.16580908
23.08093719
23.08093719
28.63988978
29.47908862
31.27956405
34.62045861
35.86468375
35.67169884
34.41910372
34.13588804
36.35702777
30.61167441
29.83991346
31.5377766
33.36361359
38.39661051
41.7296732
41.25382922
42.201721
41.60610325
39.2679181
42.41767147
44.35414715
47.01404223
47.78679762
48.19090854
46.00970043
47.43423273
49.3390832
52.82529397
52.64059228
54.67565536
55.88442219
52.68092051
51.72507703
49.48208145
50.73345177
51.33687453
53.54355564
54.81330186
55.55989561
56.79134235
56.53052551
57.29075015
58.29989275
58.92019776
58.49267229
57.35840588
56.44372409
57.12120899
58.65510461
54.96689316
53.85952168
49.10602435
48.34147823
48.21719951
50.2662308
52.05459443
50.36193646
49.49321984
48.16627652
37.72978919
18.89787599
10.83759454
14.209174
7.93
0
0
0
0
0
0
0
2.24
0
0
2.61
0
0
3.994244
7.74
0
0
1.39
0
0.833740358
5.591908185
3.724156828
11.52743689
8.583836427
10.40266238
11.10493341
16.34192867
15.36866836
15.22455009
14.729984
10.88
0
4.655296
2.63
0
0
4.344807644
5.721277
6.83
0
0
0
0
0
0
0
0
2.438044526
2.584168274
5.366396225
7.836381209
6.26157568
0.7744
2.72
0
3.103570031
2.938565593
3.10329
4.91
0
0
0
从这个向量我试图获得MaxLoss = 58.92,2.24,2.61,7.74,1.39,16.34,4.65,6.83,7.84和4.91,它们是每个0之间的最大值。
以下是我尝试过的代码,与VBA等效代码几乎完全相同(在形式上):
MaxLoss <- matrix(data=0,ncol=LengthNames,nrow=LengthDates)
for (j in 1:LengthNames){
k <- 0
for (i in 1:LengthDates){
if (is.na(Drawd2[i,j]) == TRUE){
break
} else if (Drawd2[i,j] != 0){
k <- k+1
PeakStart[k,j] <- as.Date(Dates[i])
while (Drawd2[i,j] != 0){
# k <- k
#if (is.na(Drawd[i,j]) == TRUE){
# break
#}
if (Drawd2[i,j] > MaxLoss[k,j]){
MaxLoss[k,j] <- Drawd2[i,j]
}
if (i == LengthDates){
break
}
i <- i+1
} # end while
i <- i-1
} # end elseif
} # end for i
} # end for j
Drawd2是我粘贴的矢量,LengthNames是列数,LengthNames是矢量的长度
好像k一直在while循环中添加,而不是每次序列只添加一次。我得到103个值,而不是10个值。我试图强迫它在每次都保持在k,但无济于事。因此,代码可以工作,但它给了我更多的期望值。
如果我将矢量导出到.csv中,它似乎将0保留为空白但R将它们读为0:
> Drawd2[1,1]!=0
[1] FALSE
> Drawd2[2,1]!=0
[1] TRUE
我认为我所做的并不是最优的,但是我的第一步是在R中转录我的代码,我欢迎任何优化和帮助。另外,如果我要删除第一个for循环(j),它仍然不起作用,但我想显示最终目标。
答案 0 :(得分:2)
我假设您的向量被称为x
。将其拆分为细分,由数据集中的零分隔。然后在每个段中找到最大值,最后删除那些完全由零组成的段(因为在向量中有重复的零)。
3条简单的线条!
y <- split( x , cumsum(x==0) )
res <- sapply( y , max )
res[ res != 0 ]
# 1 8 10 12 14 15 16 18 26
#58.920198 2.240000 2.610000 7.740000 1.390000 16.341929 4.655296 6.830000 7.836381
# 27
# 4.910000
如果您需要将其应用于矩阵中的每个列或行,请查看apply
。