加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何计算R中向量中按顺序排列的相同元素的数量?

发布时间:2020-12-15 05:12:35 所属栏目:Java 来源:网络整理
导读:我有一个像这样的矢量: x -c(1,1,-1,1) 我希望算法产生一个向量(3,6,2,7,1) 这意味着3个“1”,1个“-1”,6个“1”等… 我已经开发了以下算法,但它不适用于每个向量x,这可能是我将要有的. y-c(0)q=0z=0w=0e=1if (x[1]==1){q-abs(sum(x[1:(min(which(x 0))-1)
我有一个像这样的矢量:

x< -c(1,1,-1,1) 我希望算法产生一个向量(3,6,2,7,1) 这意味着3个“1”,1个“-1”,6个“1”等… 我已经开发了以下算法,但它不适用于每个向量x,这可能是我将要有的.

y<-c(0)
q=0
z=0
w=0
e=1

if (x[1]==1)
{
q<-abs(sum(x[1:(min(which(x < 0))-1)]))
y[e]<-q
k=q+1
z<-abs(sum(x[k:min(which(x < 0))]))
e=e+1
y[e]<-z
k=k+z
r<-matrix(c(which(x < 0)))
w<-matrix(c(which(x > 0)))

while( k<22 )

{

if( all(r<k) )
{
z<-sum(x[k:22])
e=e+1
y[e]<-z
k=k+z
}else
{
z<-abs(sum(x[k:min(r[which(r > k)]-1)]))
e=e+1
y[e]<-z
k=k+z
}

if( all(w<k) )
{
z<-abs(sum(x[k:22]))
e=e+1
y[e]<-z
k=k+z
}else
{z<-abs(sum(x[k:min(w[which(w > k)]-1)]))
e=e+1
y[e]<-z
k=k+z
}

}}

但对于矢量
x< -c(1,-1)
有用.

您是否有任何想法更快更容易地做到这一点或只是在我自己的代码中找到问题?

谢谢你们!

解决方法

你可以试试功能:

rle(x)
#Run Length Encoding
#  lengths: int [1:7] 3 1 6 2 2 7 1
#  values : num [1:7] 1 -1 1 -1 1 -1 1

所以rle(x)$length为你提供你想要的东西:

rle(x)$lengths
#[1] 3 1 6 2 2 7 1

@clemlaflemme函数和rle之间的效率比较:

library(microbenchmark)

x <- rep(x,5000)

microbenchmark(clem_shift(),cath_rle(),clem_cumul(),unit="relative")
#Unit: relative
#         expr        min        lq        mean     median         uq        max neval cld
# clem_shift()   1.000000   1.00000   1.0000000   1.000000   1.000000  1.0000000   100  a 
#   cath_rle()   1.181513   1.13419   0.8552573   1.095478   1.041918  0.9483564   100  a      
# clem_cumul() 325.480391 284.14827 170.1371421 265.160409 241.954976 54.5240969   100   b

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读