4

我正在用 R 编写一个采样器,它基本上是一个大的 for 循环,对于每次迭代,我都必须计算向量中的转换次数。我有一个名为 k 的向量,其中包含零和一,向量中有 1000 个条目。

我使用了以下非常慢的代码:

#we determine the number of transitions n00,n01,n10,n11
  n00=n01=n10=n11=0 #reset number of transitions between states from last time
  for(j in 1:(1000-1)){
    if(k[j+1]==1 && k[j]==0) {n01<-n01+1}
    else { if(k[j+1]==1 && k[j]==1) {n11<-n11+1}
           else { if(k[j+1]==0 && k[j]==1) {n10<-n10+1}
                  else{n00<-n00+1}
           }

    }
  }

因此,每次循环进行时,变量 n00,n01,n10,n11 都会计算向量中的转换。例如,n00 计算一个 0 后跟另一个 0 的次数。依此类推……

这很慢,而且我对 R 很陌生,所以我在这里有点绝望。如果可能的话,我不明白如何使用 grep。

谢谢您的帮助

4

3 回答 3

7

尝试这样的事情:

x <- sample(0:1,20,replace = TRUE)
> table(paste0(head(x,-1),tail(x,-1)))

00 01 10 11 
 4  3  4  8 

向量的headtail返回部分x:除了最后一个元素之外的所有部分,然后是第一个元素之外的所有部分。这意味着相应的元素是来自 的连续对x

然后paste0只需将每个转换为一个字符向量并粘贴第一个元素、第二个元素等。结果是一个包含“00”、“01”等元素的字符向量。然后table只计算每个元素的数量.

您可以将结果分配给一个新变量,如下所示:

T <- table(paste0(head(x,-1),tail(x,-1)))

自己试验每一段代码,看看它是如何工作的。运行 justhead(x,-1)等以查看每个部分的作用。

要解决下面的评论,要确保在运行时所有类型都显示为计数,请先table将其转换为因子:

x1 <- factor(paste0(head(x,-1),tail(x,-1)),levels = c('00','01','10','11'))
table(x1)
于 2013-09-26T16:29:26.203 回答
1
x <- sample(0:1, 10, replace = TRUE)
# my sample: [1] 0 0 0 0 0 1 0 1 1 0

rl <- rle(x)

zero_to_zero <- sum(rl$len[rl$val == 0 & rl$len > 1] - 1)
one_to_one <- sum(rl$len[rl$val == 1 & rl$len > 1] - 1)

zero_to_one <- sum(diff(rl$val) == -1)
one_to_zero <- sum(diff(rl$val) == 1)

x
# [1] 0 0 0 0 0 1 0 1 1 0
zero_to_zero
# [1] 4

one_to_one
# [1] 1

zero_to_one
# [1] 2

one_to_zero
# [1] 2

@joran 的答案是 faaaar 更清洁......不过,我认为我也可以完成我开始沿着(肮脏)小道的漫步,并分享结果。

于 2013-09-26T17:00:11.003 回答
1

如果我们不关心区分 n00 和 n11 情况,那么这将变得更简单:

x <- sample(0:1,20,replace = TRUE)
#  [1] 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0 0

table(diff(x))      
# -1  0  1 
#  4 11  4 

由于问题表明您主要对转换感兴趣,因此这可能是可以接受的,否则其他答案之一会更可取。

于 2013-09-26T18:17:47.460 回答