代码之家  ›  专栏  ›  技术社区  ›  jester

创建新列并使用r中的条件计算每个元素

  •  1
  • jester  · 技术社区  · 7 年前

    我有一个数据帧(df)看起来像这样,

    a    b    c
    12   14   21
    71   23   58
    20   33   64
    3    22   12
    25   55   19
    31   14   20
    29   20   31
    10   10   41
    20   37   33
    31   99   43
    42   24   34
    

    list<-c(1,3,5)
    

    我当前的代码是

    df$d<-NA
    
      for (i in 1:length(list)){
          for( j in 1:nrow(df)){
      df$d[j]<- df$c[j]- df$b[j+i]
      print(mean(df$d, na.rm=TRUE))
    }
    }
    

    对于“list”中的每个元素,我循环它并计算平均值(df$d),然后要求它再次循环,然后再次找到平均值(df$d)。

    预期结果:

    当i=1时

    a    b    c    d
    12   14   21   -2 (=21-23)
    71   23   58   25 (=58-33)
    20   33   64   42   
    3    22   12   -43
    25   55   19    5
    31   14   20    0
    29   20   31   21
    10   10   41    4
    20   37   33   -66
    31   99   43   19
    42   24   34   NA
    

    当i=3时

    a    b    c    d
    12   14   21   -1 (=21-22)
    71   23   58   3 (=58-55)
    20   33   64   50   
    3    22   12   -8
    25   55   19    9
    31   14   20    -17
    29   20   31   -68
    10   10   41    17
    20   37   33   NA
    31   99   43   NA
    42   24   34   NA
    

    然后,找到列“d”的平均值,即(平均值(df$d,na.rm=TRUE),即-15/8行=-1.875,这个平均值正是我需要的。

    这段代码非常慢,因为它有两个循环在运行,整个数据有超过50K行,真正的列表有超过15个元素,所以它需要永远。谁能帮我一下吗?非常感谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ronak Shah    7 年前

    我们可以在 list 使用 sapply lead 从…起 dplyr b c 列,然后计算 mean 移除 NA 价值观

    library(dplyr)
    sapply(list, function(x) mean(df$c - lead(df$b, x), na.rm = T))
    
    #[1]  0.500000 -1.875000 -1.666667