【发布时间】:2021-12-17 14:31:12
【问题描述】:
我在这里潜伏了很长时间,但最后我的第一个问题 :) 这是我想在 excel 中实现的功能,但我似乎无法在 R 中找到解决方案。
这是我尝试做的,但它似乎不允许我使用我正在尝试创建的新列的先前值进行操作。
这是一个可重现的例子:
library(dplyr)
set.seed(42) ## for sake of reproducibility
dat <- data.frame(date=seq.Date(as.Date("2020-12-26"), as.Date("2020-12-31"), "day"))
这将是数据框的输出:
dat
date
1 2020-12-26
2 2020-12-27
3 2020-12-28
4 2020-12-29
5 2020-12-30
6 2020-12-31
期望的输出:
date periodNumber
1 2020-12-26 1
2 2020-12-27 2
3 2020-12-28 3
4 2020-12-29 4
5 2020-12-30 5
6 2020-12-31 6
我的尝试:
dat %>%
mutate(periodLag = dplyr::lag(date)) %>%
mutate(periodNumber = ifelse(is.na(periodLag)==TRUE, 1,
ifelse(date == periodLag, dplyr::lag(periodNumber), (dplyr::lag(periodNumber) + 1))))
Excel 公式截图 (https://i.ibb.co/FHq7sfL/screenshot.png)
感谢大家的帮助!你们都是最棒的!
【问题讨论】:
-
如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。请用文字解释您要完成的工作,而不仅仅是要求将代码从一种语言翻译成另一种语言。这样可以让更多人帮助你。
-
在您的第二个变异表达式中,您尝试将
periodNumber设置为lag(periodNumber)(尚不存在)。也许您想使用periodLag? (即您正在尝试使用A = ifelse(some_test, lag(A), lag(A) + 1)创建一个 new 列 A -
我很想得到周期编号,而不是周期的日期。因此,我试图检查当前的
date是否等于前一个date,如果是,则使用与上一行中相同的periodNumber。 -
data.table::rleid(dat$date) -
但是
periodNumber还不存在(在您尝试在ifelse中使用它的时候)。 “我希望获得期间编号,而不是期间的日期” - 在这种情况下,您需要两个分隔符ifelse,其中第一个ìfelse“初始化列periodNumber。 ..一般情况下,不能给本身不存在的变量赋值...