多组长格式输入的新变量计算
New variable calculation with input from multple groups in long format
我想知道是否可以在不将我的数据转换为宽格式的情况下使用 dplyr
进行以下计算。我的数据如下所示:
data <- data.frame(ID = c(rep(1:2, 6)),
Date = c(rep(as.Date('2022-03-01'), 4), rep(as.Date('2022-03-02'), 4), rep(as.Date('2022-03-03'), 4)),
Type = rep(LETTERS[c(1,1,2,2)], 3),
Value = c(1,2,101,102,3,4,103,104,5,6,105,106))
我的目标是做一个计算,其中涉及类型B的某一天的值,以及类型A的前一天的值AND类型B . 如果计算只在一个组内,那么 dplyr::lag
是可行的方法。但在这种情况下我看不到方法。我想避免将我的数据转换为宽格式。
举个例子,我想计算 X = B(t) - A(t-1) * B(t-1),其中 t 表示日期。在这种情况下,我的目标类似于以下数据框:
data_goal <- data.frame(ID = c(rep(1:2, 3)),
Date = c(rep(as.Date('2022-03-01'), 2), rep(as.Date('2022-03-02'), 2), rep(as.Date('2022-03-03'), 2)),
X = c(NA, NA, 103 - 1 * 101, 104 - 2 * 102, 105 - 3 * 103, 106 - 6 * 104))
如果我自己计算每种类型的每日差异,我的解决方案是
data |>
dplyr::arrange(Date) |>
dplyr::group_by(ID, Type) |>
dplyr::mutate(Diff = Value - dplyr::lag(Value, n = 1))
但不幸的是,我不知道如何扩展它。
非常感谢任何帮助!
非常感谢!
请注意,如果这不可能,我也很高兴知道。然后我会继续将 table 转换为宽格式并从那里继续。我的实际数据有更多类型,这就是为什么我想避免这种情况。
可能会有用
data <- data.frame(
ID = c(rep(1:2, 6)),
Date = c(rep(as.Date('2022-03-01'), 4), rep(as.Date('2022-03-02'), 4), rep(as.Date('2022-03-03'), 4)),
Type = rep(LETTERS[c(1, 1, 2, 2)], 3),
Value = c(1, 2, 101, 102, 3, 4, 103, 104, 5, 6, 105, 106)
)
library(tidyverse)
data %>%
group_by(Date) %>%
mutate(grp = cur_group_id()) %>%
ungroup() %>%
summarise(Diff = map(.x = seq(max(grp)),
.f = ~ Value[Type == "B" &
grp == .x] - Value[Type == "A" &
grp == .x - 1] * Value[Type == "B" &
grp == .x - 1])) %>%
unnest(Diff) %>%
add_case(Diff = rep(NA, length(unique(data$ID))), .before = 1) %>%
add_column(distinct(data, ID, Date), .before = 1)
#> # A tibble: 6 × 3
#> ID Date Diff
#> <int> <date> <dbl>
#> 1 1 2022-03-01 NA
#> 2 2 2022-03-01 NA
#> 3 1 2022-03-02 2
#> 4 2 2022-03-02 -100
#> 5 1 2022-03-03 -204
#> 6 2 2022-03-03 -310
由 reprex package (v2.0.1)
于 2022-04-26 创建
我想知道是否可以在不将我的数据转换为宽格式的情况下使用 dplyr
进行以下计算。我的数据如下所示:
data <- data.frame(ID = c(rep(1:2, 6)),
Date = c(rep(as.Date('2022-03-01'), 4), rep(as.Date('2022-03-02'), 4), rep(as.Date('2022-03-03'), 4)),
Type = rep(LETTERS[c(1,1,2,2)], 3),
Value = c(1,2,101,102,3,4,103,104,5,6,105,106))
我的目标是做一个计算,其中涉及类型B的某一天的值,以及类型A的前一天的值AND类型B . 如果计算只在一个组内,那么 dplyr::lag
是可行的方法。但在这种情况下我看不到方法。我想避免将我的数据转换为宽格式。
举个例子,我想计算 X = B(t) - A(t-1) * B(t-1),其中 t 表示日期。在这种情况下,我的目标类似于以下数据框:
data_goal <- data.frame(ID = c(rep(1:2, 3)),
Date = c(rep(as.Date('2022-03-01'), 2), rep(as.Date('2022-03-02'), 2), rep(as.Date('2022-03-03'), 2)),
X = c(NA, NA, 103 - 1 * 101, 104 - 2 * 102, 105 - 3 * 103, 106 - 6 * 104))
如果我自己计算每种类型的每日差异,我的解决方案是
data |>
dplyr::arrange(Date) |>
dplyr::group_by(ID, Type) |>
dplyr::mutate(Diff = Value - dplyr::lag(Value, n = 1))
但不幸的是,我不知道如何扩展它。
非常感谢任何帮助!
非常感谢!
请注意,如果这不可能,我也很高兴知道。然后我会继续将 table 转换为宽格式并从那里继续。我的实际数据有更多类型,这就是为什么我想避免这种情况。
可能会有用
data <- data.frame(
ID = c(rep(1:2, 6)),
Date = c(rep(as.Date('2022-03-01'), 4), rep(as.Date('2022-03-02'), 4), rep(as.Date('2022-03-03'), 4)),
Type = rep(LETTERS[c(1, 1, 2, 2)], 3),
Value = c(1, 2, 101, 102, 3, 4, 103, 104, 5, 6, 105, 106)
)
library(tidyverse)
data %>%
group_by(Date) %>%
mutate(grp = cur_group_id()) %>%
ungroup() %>%
summarise(Diff = map(.x = seq(max(grp)),
.f = ~ Value[Type == "B" &
grp == .x] - Value[Type == "A" &
grp == .x - 1] * Value[Type == "B" &
grp == .x - 1])) %>%
unnest(Diff) %>%
add_case(Diff = rep(NA, length(unique(data$ID))), .before = 1) %>%
add_column(distinct(data, ID, Date), .before = 1)
#> # A tibble: 6 × 3
#> ID Date Diff
#> <int> <date> <dbl>
#> 1 1 2022-03-01 NA
#> 2 2 2022-03-01 NA
#> 3 1 2022-03-02 2
#> 4 2 2022-03-02 -100
#> 5 1 2022-03-03 -204
#> 6 2 2022-03-03 -310
由 reprex package (v2.0.1)
于 2022-04-26 创建