我有一个数据框,其中包含天数,成本和一些变量以在新列中求和。例如:
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)
任何人都可以帮我解决这些问题吗?我有一个非常大的数据需要分析。
答案 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))
最好使用days
将Date
转换为df[, days := as.IDate(days, "%d/%m/%Y")]
课程,以便您可以通过它进行排序。