簡體   English   中英

R 中嵌套 for 循環的替代方案

[英]Alternative for nested for loop in R

我正在嘗試在 R 中實現如下結果:我有一個數據集,如下所示

原始數據集

我試圖達到如下結果:

結果數據集

條件是:

  1. 忽略第 3 列中每組的第一行的值,根據下一行的值確定依次有多少個 FALSE。 輸入上一行的數字。
  2. 如果下一個值為 TRUE,則輸入 0 並移動到該行的下一個值並重復該過程。
  3. 每組的最后一行應該有 0

約束:不想使用嵌套的 for 循環。 有沒有更好的方法來實現 R 中的結果。

提前感謝您的建議/解決方案。

如果您的數據是可重現的,那么提供幫助會容易得多。 圖像中的數據沒有列名,但以下代碼再現了數據框並命名了列col1col2col3

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM