【问题标题】:avoid for-loop in R避免R中的for循环
【发布时间】:2016-03-24 00:35:04
【问题描述】:

我确信之前已经发布过类似的问题,但没有一个答案我无法找到特定于我的查询的答案。

我有以下代码检查第 2 列中的每一行的值“STRT”,如果找不到该值,它会从上面的行复制第 3 列中的值。目前,由于我有一个包含超过 300,000 行的数据集,因此此过程需要 1 多个小时才能运行。

for (i in 1:nrow(RTable)) {
    if (RTable[i,2] != "STRT") {
        RTable[i,3] <- RTable[i-1,3]
    }
}

理想情况下,我希望有一个看起来像这样的解决方案

ifelse(RTable$col2 != "STRT", RTable$col3[当前行] = RTable$col3[当前行-1]

任何帮助将不胜感激。提前感谢您的帮助!!!

【问题讨论】:

  • dput(RTable) 作为您的问题和发布代码的一部分,我们可以运行而无需猜测问题是什么。非常感谢!

标签: r for-loop optimization


【解决方案1】:

创建一个临时变量

RTable$col4<-lag(RTable$col3)

根据需要使用 ifelse

library(dplyr)
RTable %>% mutate(col3=ifelse(col2!="STRT",col3,col4))

【讨论】:

  • 谢谢Adiana - 我觉得你的解决方案让我非常接近我需要的结果。由于某种原因,它仍然无法正常工作。你介意解释一下 (%>%) 的作用吗?
  • %>% 告诉使用前一个表达式的结果作为下一个表达式的第一个参数。你遇到了什么错误?
  • 您需要library(magrittr) 才能使用%&gt;%
【解决方案2】:

我们可以使用data.table。将“data.frame”转换为“data.table”(setDT(RTable)),使用shift(“col4”)创建“col3”的lag,并分配(:=)“col4”的值' 到 'col3' 其中col2 不等于 "STRT"。

library(data.table)
setDT(RTable)[, col4 := shift(col3)][col2!="STRT", col3 := col4]

【讨论】:

    【解决方案3】:

    可能创建第四列,将第三列移位,然后使用您的ifelse 语句:

    a = c(0,0,0,0)                            # just so the column indices match to yours
    x = c(1,2,3,4)
    y = c(2,3,4,5)
    RTable = data.frame(a,x,y)
    
    RTable[,4] = c(0,RTable[-nrow(RTable),3])  # Delete last value in column and add one to the beginning
    # ifelse(RTable$col2 != "STRT", RTable$col3, RTable$col4)
    

    我不知道您的数据的限制,但这是一个选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-09
      • 2011-06-21
      • 1970-01-01
      • 2021-08-19
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多