回答編集履歴

2

2024/02/19 16:21

投稿

melian
melian

スコア19865

test CHANGED
@@ -10,12 +10,11 @@
10
10
  c("無治療", NA, "A", NA, NA)))
11
11
 
12
12
  #
13
- lst <- c("中断", "無治療", "無治療")
14
- names(lst) <- c("A", "中断", "無治療")
13
+ next_tyra <- setNames(c("中断", "無治療", "無治療"), c("A", "中断", "無治療"))
15
14
  data2 <- data %>%
16
15
  group_by(id) %>%
17
16
  mutate(
18
- tyra = accumulate(tyra, ~ifelse(is.na(.y), lst[last(.x)], .y))
17
+ tyra = accumulate(tyra, ~ifelse(is.na(.y), next_tyra[last(.x)], .y))
19
18
  ) %>%
20
19
  ungroup()
21
20
 

1

2024/02/19 15:36

投稿

melian
melian

スコア19865

test CHANGED
@@ -1,5 +1,4 @@
1
- 以下は `tidyverse` を利用する場合です。
1
+ 以下は `purrr::accumulate()` を利用する場合です。
2
-
3
2
  ```r
4
3
  library(tidyverse)
5
4
 
@@ -10,27 +9,35 @@
10
9
  c("無治療", NA, NA, "A", "A"),
11
10
  c("無治療", NA, "A", NA, NA)))
12
11
 
13
- data_out <- data.frame(
14
- id = c(rep(1, 5), rep(2, 5), rep(3, 5)),
15
- phase = c(rep(1:5,3)),
16
- tyra = c(c("A", "A", "A", "中断", "無治療"),
17
- c("無治療", "無治療", "無治療", "A", "A"),
18
- c("無治療", "無治療", "A", "中断", "無治療")))
19
-
20
12
  #
21
13
  lst <- c("中断", "無治療", "無治療")
22
14
  names(lst) <- c("A", "中断", "無治療")
23
15
  data2 <- data %>%
24
16
  group_by(id) %>%
25
- mutate(across(tyra, ~{
26
- v <- c()
17
+ mutate(
27
- for (i in .x) {
28
- v <- c(v, ifelse(is.na(i), lst[last(v)], i))
18
+ tyra = accumulate(tyra, ~ifelse(is.na(.y), lst[last(.x)], .y))
29
- }
30
- v
31
- })) %>%
19
+ ) %>%
32
20
  ungroup()
33
21
 
34
22
  data2
23
+
24
+ # # A tibble: 15 × 3
25
+ # id phase tyra
26
+ # <dbl> <int> <chr>
27
+ # 1 1 1 A
28
+ # 2 1 2 A
29
+ # 3 1 3 A
30
+ # 4 1 4 中断
31
+ # 5 1 5 無治療
32
+ # 6 2 1 無治療
33
+ # 7 2 2 無治療
34
+ # 8 2 3 無治療
35
+ # 9 2 4 A
36
+ # 10 2 5 A
37
+ # 11 3 1 無治療
38
+ # 12 3 2 無治療
39
+ # 13 3 3 A
40
+ # 14 3 4 中断
41
+ # 15 3 5 無治療
35
42
  ```
36
43