在R

时间:2019-03-03 22:31:05

标签: r

我有359个观测值的二进制时间序列。 像这样; 0 0 0 0 0 0 0 0 0 1个 0 0 0 0 1个 0 0 0 ... 我想以相同的间隔但排列顺序生成n个数据样本。 为此,我首先发现原始数据从零变为1的时间是这样的:

147 65 10 251

,然后将间隔的顺序随机化为以下形式:

251 10 65 147
10  251  147 65
.
. 
.

到目前为止,我的代码是这样的:

mydata <- "C:/Users/me/Desktop/2.xlsx"
library("xlsx")
library("tseries")
my_data <-  read.xlsx(mydata, sheetName = "Sheet1", header = F)
file <- "C:/Users/me/Desktop/pp.xlsx"
ts=my_data[6]
ts=unlist(ts)

for (i in 1:100){
  diff.ts<-diff(ts)
  x=sample(diff(which(diff.ts==1)))
  print(x)
  write.xlsx(x,file[i], sheetName = "Sheet1",col.names=TRUE, row.names=FALSE, append=FALSE, password=NULL)
}

但是

  1. 即使在打印时看起来还不错,我也无法将所有这些内容存储在.xlsx文件中
  2. 我的第二个问题是,我不仅想知道发生0到1的哪个时间,而且还想将它们写为原始数据,例如,如果在一个随机样本中间隔为10 251 147 65我想要一个存储的列,在第10、251、147和65行中的1作为一,另一行为零,像这样:

    0 0 0 0 0 0 0 0 0 1 0 0 .....

对不起,英语错误

1 个答案:

答案 0 :(得分:0)

间隔目标不清楚,可能使用下面的sample()函数回答了排列的间隔问题,该函数将随机选择1s和0s的分布。您还可以调整更改选择0或1的概率,这里是50/50%。此外,如果您想要一个随机样本但要确保代码可重复,则可以在会话中强制使用随机种子来每次绘制相同的排列,方法是:set.seed(123456),选择您认为合适的任何种子。

sample(x=c(0,1),size=359,replace=T,prob=c(0.5,0.5))

或者,您的问题可能暗示希望在特定索引处将值设置为等于1。在这里,以147,65,10,251为例,您可以执行以下操作:

intervals <- rep(0,359)
intervals[c(147,65,10,251)] <- 1

也许是这样?

intervals <- rep(0,359)
intervals[sample(c(147,65,10,251))]  <- 1

这是一个分为两部分的问题,也是对excel编写问题的解答:您在for循环中调用了write.xlsx,这意味着您在每个循环中都在编写文件。这是否可能是您想要的行为?我认为最好写整个数据集。但是,由于您将file [i]指定为输出,并且变量文件是单个值(或一个长度的向量),因此会出现错误。您可以在write.xlsx中将其更改为write.xlsx(x,paste0("my_file_num",i,".xlsx"), ...或将调用移出循环,如下所示

file <- "C:/Users/me/Desktop/pp.xlsx"
ts=my_data[6]
ts=unlist(ts)
samples <- NULL
for (i in 1:100){
  diff.ts<-diff(ts)
  x=sample(diff(which(diff.ts==1)))
  samples <- append(samples,list(samples=x))
  print(x)
}

  write.xlsx(samples,file, sheetName = "Sheet1",col.names=TRUE, row.names=FALSE, append=FALSE, password=NULL)