【问题标题】:How can I create a column in R that calculates a value of a row based on the previous row's value?我可以在 R 中创建一列,根据前一行的值计算一行的值吗?
【发布时间】: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。 ..一般情况下,不能给本身不存在的变量赋值...

标签: r function


【解决方案1】:

你可以使用dplyrcur_group_id()

library(dplyr)
set.seed(42)

# I used a larger example
dat <- data.frame(date=sample(seq.Date(as.Date("2020-12-26"), as.Date("2020-12-31"), "day"), size = 30, replace = TRUE))

dat %>% 
  arrange(date) %>% # needs sorting because of the random example
  group_by(date) %>% 
  mutate(periodNumber = cur_group_id())

返回

# A tibble: 30 x 2
# Groups:   date [6]
   date       periodNumber
   <date>            <int>
 1 2020-12-26            1
 2 2020-12-26            1
 3 2020-12-26            1
 4 2020-12-26            1
 5 2020-12-26            1
 6 2020-12-26            1
 7 2020-12-26            1
 8 2020-12-26            1
 9 2020-12-27            2
10 2020-12-27            2
11 2020-12-27            2
12 2020-12-27            2
13 2020-12-27            2
14 2020-12-27            2
15 2020-12-27            2
16 2020-12-28            3
17 2020-12-28            3
18 2020-12-28            3
19 2020-12-29            4
20 2020-12-29            4
21 2020-12-29            4
22 2020-12-29            4
23 2020-12-29            4
24 2020-12-29            4
25 2020-12-30            5
26 2020-12-30            5
27 2020-12-30            5
28 2020-12-30            5
29 2020-12-30            5
30 2020-12-31            6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    相关资源
    最近更新 更多