创建一个新列作为两行元素的SUM如果今天的成本更低/更高

时间:2016-02-15 12:01:16

标签: r

我有一个数据框,其中包含天数,成本和一些变量以在新列中求和。例如:

    days      cost    b    c    d
1 01/12/2006  3378    75   75   80    
2 04/12/2006  3390    18   23   22    
3 05/12/2006  3346    53   53   57    
4 06/12/2006  3390    86   87   93    
5 07/12/2006  3363    67   67   77    
6 08/12/2006  3382    78   80   84    

我想创建一个新列“new”,它显示+ b和-d之和,如果今天成本大于或等于两天前,或者-b和+ d之和,如果今天成本更低比两天前:

“new”=(+ b-d,如果今天费用> =两天前)或(-b + d,如果今天费用<两天前)

    days      cost    b    c    d    new
1 01/12/2006  3378    75   75   80    NA (#we don't have past days)
2 04/12/2006  3390    18   23   22    NA
3 05/12/2006  3346    53   53   57    4  (#since 3346<3378,-53+57= 4)
4 06/12/2006  3390    86   87   93    -7 (#since 3390=3309,86-93= -7)
5 07/12/2006  3363    67   67   77    -10(#since 3363>3346,67-77=-10)
6 08/12/2006  3382    78   80   84    6  (#since 3382<3390,-78+84= 6)

任何人都可以帮我解决这些问题吗?我有一个非常大的数据需要分析。

1 个答案:

答案 0 :(得分:4)

使用data.table(或dplyr)即可

library(data.table)
setDT(df)[, New := ifelse(cost >= shift(cost, 2L), b - d, d - b)]
df
#          days cost  b  c  d New
# 1: 01/12/2006 3378 75 75 80  NA
# 2: 04/12/2006 3390 18 23 22  NA
# 3: 05/12/2006 3346 53 53 57   4
# 4: 06/12/2006 3390 86 87 93  -7
# 5: 07/12/2006 3363 67 67 77 -10
# 6: 08/12/2006 3382 78 80 84   6

或使用索引

setDT(df)[, New := c(-1, 1)[(cost >= shift(cost, 2L)) + 1L] * (b - d)]

或使用dplyr

library(dplyr)
df %>%
  mutate(New = ifelse(cost >= lag(cost, 2L), b - d, d - b))

或使用良好的旧基础

transform(df, New = ifelse(cost >= c(rep(NA, 2L), head(cost, -2L)), b - d, d - b))

最好使用daysDate转换为df[, days := as.IDate(days, "%d/%m/%Y")]课程,以便您可以通过它进行排序。