问题:
我有一个数据框,其中的列显示事件是否发生,以及月,日和年的列。最后3个被转换为日期向量。我想制作一个矩阵,显示某个事件是否在给定的时间段内发生。在此矩阵中,行表示站点,列表示日期。我能够编写一个for循环来做这件事,但似乎可能有更好的方法来执行此操作,无论是使用apply还是其他一些基本操作。你会怎么做?
守则:
#Initialize events matrix
events = matrix(FALSE,nrow(predicted),ncol(predicted))
# Mark the presence of events
for (i in 1:nrow(events)){
if ((days_from_start[i]>-1)&(days_from_start[i]<=ncol(predicted)))
events[i,days_from_start[i]] = !input_data$Event[i]
}
背景:
下一步是将事件矩阵与具有相同形状的各种模型输出进行比较。与矩阵大小相比,数据帧中的事件相对较少; (可能是不正确的)假设是数据框完全列出所有事件,并且未列出的矩阵单元没有经历事件。我是R的新手,所以如果你认为我正在努力解决这个问题,我有兴趣听听同样问题的其他方法。
数据:
> input_data$Event[1:5]
[1] FALSE FALSE FALSE FALSE TRUE
> input_data$Year[1:5]
[1] 2010 2010 2011 2010 2010
> days_from_start[1:5]
Time differences in days
[1] 834 1018 1106 847 1055
> dim(predicted)
[1] 649 732
答案 0 :(得分:0)
由于events[i,days_from_start[i]]
正在events
矩阵中访问更多或更少的随机位置(因为可能您没有days_from_start
的模式),因此可能很难不使用循环。可能类似下面的内容将起作用。我没有测试过这个,因为你没有发布任何数据集。
foo<- (days_from_start>-1)&(days_from_start<=ncol(predicted) )
index_matrix<-cbind((1:i)[foo],days_from_start[(1:i)[foo]])
events[index_matrix]<-!input_data$Event[index_matrix[,1]]
第一行的作用是创建一个逻辑向量,TRUE
你想要做什么
下一行创建一组索引对,您可以在其中将数据插入events
矩阵。最后一行是插入。