将数据帧转换为矩阵而不进行循环

时间:2014-08-19 19:17:14

标签: r date for-loop matrix dataframe

问题:

我有一个数据框,其中的列显示事件是否发生,以及月,日和年的列。最后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

1 个答案:

答案 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矩阵。最后一行是插入。