【问题标题】:Creat new column and calculate each element with conditions in r创建新列并使用 r 中的条件计算每个元素
【发布时间】:2018-03-09 15:50:37
【问题描述】:

我有一个数据框(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))
}
}

对于“列表”中的每个元素,我循环它并计算平均值(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

然后,找到“d”列的平均值,即 (mean(df$d, na.rm=TRUE),即 5/10rows =0.5,这就是我真正需要的平均值。

当 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”列的平均值,即 (mean(df$d, na.rm=TRUE),即 -15/8rows =-1.875,这个平均值正是我所需要的。

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

【问题讨论】:

  • 我只是对其进行了编辑,在“列表”中为 i 的前 2 个循环添加了一些预期结果,希望对您有所帮助,谢谢

标签: r loops calculated-columns


【解决方案1】:

我们可以使用sapply 遍历list 中的每个元素。我们使用dplyr 中的lead 来获取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

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 2023-03-08
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2023-03-16
    • 2018-09-22
    • 2014-10-01
    • 2019-03-26
    相关资源
    最近更新 更多