【问题标题】:R Constant Increment Subset of Vector向量的 R 常量增量子集
【发布时间】:2016-03-28 03:34:01
【问题描述】:

我有一个数组(选项触发):

 550  600  620  640  650  660  680  700  710  720  730  740  750  760  770  780  790  800  810  820  830  840  850  860  870 880  890  900  910  920  930  940  950  960  970  980  990 1000 1010 1020 1030 1040 1050 1060 1070 1080 1090 1100 1110 1120 1130 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300 1310 1320 1330 1340 1350 1360 1370 1380 1390 1400 1410 1420 1430 1440 1450 1460 1470 1480 1490 1500 1520

它有时在开始或结束时有不均匀的增量。例如,第一个数字是 550,从那里马上到 600,增加了 50 个点。

我知道在一个中心数字(在货币上)附近存在上述向量的一个子集,它增加 10 个点。我想以某种方式提取它。该向量的中心数是 1090。它可以针对不同的向量不断变化,例如上面的向量 - 但应该在中心附近。

所以对于上面的数组,我要提取:

 700  710  720  730  740  750  760  770  780  790  800  810  820  830  840  850  860  870 880  890  900  910  920  930  940  950  960  970  980  990 1000 1010 1020 1030 1040 1050 1060 1070 1080 1090 1100 1110 1120 1130 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300 1310 1320 1330 1340 1350 1360 1370 1380 1390 1400 1410 1420 1430 1440 1450 1460 1470 1480 1490 1500

在这个向量中,所有数字都以 10 个点的恒定速率递增。所以基本上我希望能够将第一个向量子集为一个在 10 点处不断增加的子集。我该怎么做?

一种方式太循环了。取 10 个点的差异和子集之间的差异。但是这种方式不是很优雅,因为我必须设置一个数字来停止循环。很想听听是否有更好的方法。

谢谢

编辑:

对于以下序列,朱利叶斯的回答似乎不起作用..

700  710  720  730  740  750  760  770  780  790  800  810  820  830  840  850  860  870  880  890  900  910  920  930  940  950  960  970  980  990 1000
1010 1020 1030 1040 1050 1060 1070 1080 1090 1100 1110 1120 1130 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230 1240 1250 1260 1270 1280 1290 1300 1310
1320 1330 1340 1350 1360 1370 1380 1390 1400 1450 1500

当我使用朱利叶斯的回答时,我得到了: 1410 1450 1460141014101B14101B14101B14101B14101B14101B14101B14101630 1630 1630 1630 1630 1630 1630 1690 1630 1690 1630 1690 1690 1630 1690 1670 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 160 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 1690 160 1720 1730 1740 1780 1790 1800 1818181818181818201830 18301880188018801880181818181818181910 1910 1930 1940 1950 1950 1950 1950 1970 1970 1970 1980 1980 1980 1980 1980 1990 1990 1990 1990 2000 2000年2010年2020 2030 2040 2050 2060 2070 2080 2090 2100 2110

【问题讨论】:

  • “围绕中心”不是很精确。是否可以假设您正在寻找具有恒定增量的最长子序列?
  • rle(diff(your_vector)) 之类的内容应该会有所帮助。
  • 而且,为了清楚起见,您的意思是 vector 对,不是 array 类的对象?

标签: r


【解决方案1】:

以下几行给出了具有恒定增量 10 的最长子序列:

v <- rle(x - 1:length(x) * 10)
v$v[which.max(v$l)] + (sum(v$l[seq_len(which.max(v$l) - 1)]) + 1:max(v$l)) * 10
# [1]  700  710  720  730 ... 1500

【讨论】:

  • 您好,我刚刚有时间尝试您的建议,但它似乎不适用于我给定的示例..(请参阅编辑)
【解决方案2】:

使用这段代码:

#Subtracting each value by the successor in the vector
b <- a[2:length(a)]-a[1:(length(a)-1)]
#Which difference value has the longest run length
maxpos <- which(rle(b)$length==max(rle(b)$length))
# Extracting the starting and ending indices
start <- sum(rle(b)$length[1:maxpos-1]) + 1
end <- start + rle(b)$length[maxpos]

#Extracted values
a[start:end]

输出:

[1]  700  710  720  730  740  750  760  770  780 ...

【讨论】:

  • 人们也可以使用b &lt;- diff(a),而不是@Gregor 的评论中看到的第一行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多