[英]Alternative for nested for loop in R
我正在嘗試在 R 中實現如下結果:我有一個數據集,如下所示
我試圖達到如下結果:
條件是:
約束:不想使用嵌套的 for 循環。 有沒有更好的方法來實現 R 中的結果。
提前感謝您的建議/解決方案。
如果您的數據是可重現的,那么提供幫助會容易得多。 圖像中的數據沒有列名,但以下代碼再現了數據框並命名了列col1
、 col2
和col3
:
df <- data.frame(col1 = rep(1:17, 2),
col2 = rep(c("A", "B"), each = 17),
col3 = rep(rep(c(FALSE, TRUE), 4),
times = c(2, 10, 3, 4, 5, 3, 3, 4)))
為了滿足您的需要,我們可以使用rleid
中的data.table
根據第 3 列中每次運行的 TRUE 或 FALSE 對數據進行分組,然后為 FALSE 段插入rev
seq
。 最后, ungroup
,然后使用lead
將新列向上移動一個 position。
library(tidyverse)
df <- df %>%
group_by(grp = data.table::rleid(col3)) %>%
mutate(col4 = rev(seq(n())) * (1 - col3)) %>%
group_by(col2) %>%
mutate(col4 = lead(col4, default = 0)) %>%
select(-grp)
結果與您預期的 output 匹配:
print(df, n = 34)
#> # A tibble: 34 x 4
#> col1 col2 col3 col4
#> <int> <chr> <lgl> <dbl>
#> 1 1 A FALSE 1
#> 2 2 A FALSE 0
#> 3 3 A TRUE 0
#> 4 4 A TRUE 0
#> 5 5 A TRUE 0
#> 6 6 A TRUE 0
#> 7 7 A TRUE 0
#> 8 8 A TRUE 0
#> 9 9 A TRUE 0
#> 10 10 A TRUE 0
#> 11 11 A TRUE 0
#> 12 12 A TRUE 3
#> 13 13 A FALSE 2
#> 14 14 A FALSE 1
#> 15 15 A FALSE 0
#> 16 16 A TRUE 0
#> 17 17 A TRUE 0
#> 18 1 B TRUE 0
#> 19 2 B TRUE 5
#> 20 3 B FALSE 4
#> 21 4 B FALSE 3
#> 22 5 B FALSE 2
#> 23 6 B FALSE 1
#> 24 7 B FALSE 0
#> 25 8 B TRUE 0
#> 26 9 B TRUE 0
#> 27 10 B TRUE 3
#> 28 11 B FALSE 2
#> 29 12 B FALSE 1
#> 30 13 B FALSE 0
#> 31 14 B TRUE 0
#> 32 15 B TRUE 0
#> 33 16 B TRUE 0
#> 34 17 B TRUE 0
使用reprex v2.0.2創建於 2022-09-07
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.