【问题标题】:Convert data frame to matrix without looping将数据框转换为矩阵而不循环
【发布时间】:2014-10-13 00:27:38
【问题描述】:

问题:

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

【问题讨论】:

    标签: r date for-loop matrix dataframe


    【解决方案1】:

    由于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 矩阵。最后一行进行插入。

    【讨论】:

    • 只想感谢那些修复了我代码中明显错误的人。我真的应该比在这里更加小心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多