如果你有多个if条件,如何使用apply函数而不是for循环

时间:2017-01-30 10:51:41

标签: r loops dataframe apply

第一届DF:

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)。

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

此外,我们必须查看新形成的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函数吗?

1 个答案:

答案 0 :(得分:0)

我的建议是:

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

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