【问题标题】:How to use apply function instead of for loop if you have multiple if conditions to be excecuted如果要执行多个 if 条件,如何使用 apply 函数而不是 for 循环
【发布时间】:2017-01-30 10:51:41
【问题描述】:

第一后卫:

t.d
  V1 V2 V3 V4
1  1  6 11 16
2  2  7 12 17
3  3  8 13 18
4  4  9 14 19
5  5 10 15 20


names(t.d) <- c("ID","A","B","C")

t.d$FinalTime <- c("7/30/2009 08:18:35","9/30/2009 19:18:35","11/30/2009 21:18:35","13/30/2009 20:18:35","15/30/2009 04:18:35")

t.d$InitTime <- c("6/30/2009 9:18:35","6/30/2009 9:18:35","6/30/2009 9:18:35","6/30/2009 9:18:35","6/30/2009 9:18:35")

>t.d
  ID  A  B  C           FinalTime          InitTime
1  1  6 11 16  7/30/2009 08:18:35 6/30/2009 9:18:35
2  2  7 12 17  9/30/2009 19:18:35 6/30/2009 9:18:35
3  3  8 13 18 11/30/2009 21:18:35 6/30/2009 9:18:35
4  4  9 14 19 13/30/2009 20:18:35 6/30/2009 9:18:35
5  5 10 15 20 15/30/2009 04:18:35 6/30/2009 9:18:35

第二个 DF:

> s.d
   F  D  E                Time
1  10 19 28  6/30/2009 08:18:35
2  11 20 29  8/30/2009 19:18:35
3  12 21 30  9/30/2009 21:18:35
4  13 22 31 01/30/2009 20:18:35
5  14 23 32 10/30/2009 04:18:35
6  15 24 33 11/30/2009 04:18:35
7  16 25 34 12/30/2009 04:18:35
8  17 26 35 13/30/2009 04:18:35
9  18 27 36 15/30/2009 04:18:35

输出为:

从 DF "t.d" 我必须计算 "FinalTime" 和 "InitTime" 之间每一行的时间间隔(InitTime 总是小于 FinalTime)。

必须形成来自“s.d”的另一个DF“temp”,其数据仅在上述时间间隔内,然后必须采用“F”、“D”、“E”的最新值并将其附加到计算时间间隔的“t.d”的“第 i”行。

我们还要看看新形成的DF“temp”是否满足以下条件:

这里的'j'代表每一行的值:

if(temp$F[j] < 35.5) + (temp$D[j] >= 100) >= 1)
{
  temp$Flag <- 1
} else{
  temp$Flag <- 0
}

最初我在数据框中有 300 万行,每个 DF 中有 20 列。

我已经使用“for 循环”解决了上述问题,但显然需要 2 到 3 天,因为行数很多。

(如果每行满足多个条件,我是否必须向结果 DF 添加新列?)

有人可以提出不同的技术吗?喜欢使用 apply 函数吗?

【问题讨论】:

  • 我不确定,但 dplyr 包中的聚合函数似乎是您正在寻找的。​​span>
  • 首先,您的日期时间列应该是正确的类型。将这些列强制为POSIXct。接下来看看data.tablefoverlaps函数。

标签: r loops dataframe apply


【解决方案1】:

我的建议是:

  • 在行索引上使用 lapply
  • 在函数中处理调用你的 if 分支
  • 返回您的数据框或 NULL
  • 将所有内容与 rbind 结合起来
  • 通过将 lapply 替换为 'parallel' 包中的 mclapply,您的代码将并行执行。

    resultList <- lapply(1:nrow(t.d), function(i){
    do stuff
    if(condition){
        return(df)
    }else{
        return(NULL)
    }
    resultDF <- do.call(rbind, resultList)
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2014-07-01
    • 2021-01-08
    • 1970-01-01
    • 2020-12-14
    • 2020-05-31
    相关资源
    最近更新 更多