簡體   English   中英

在列值更改之前,用 R 中的 NA 替換多列中的某些值

[英]Replace certain values across multiple columns, before column values change, with NA in R

我有一個這樣的數據框:

dat <- data.frame(Target = c(rep("01", times = 8), rep("02", times = 5), 
                             rep("03", times = 4)),
                         targ2clicks = c(1, 1, 1, 1, 0, 0 ,0 , 1, 1, 0, 0, 0, 1,
                                         0, 0, 0, 1),
                  targ2midclicks = c(1, 1, 1, 1, 0, 0 ,0 , 1, 1, 0, 0, 0, 1,
                                     1, 0, 0, 1),
                  targ2rClicks = c(0, 0, 0, 1, 0, 0 ,0 , 1, 0, 0, 0, 0, 1,
                                  1, 1, 1, 1))

    Target targ2clicks targ2midclicks targ2rClicks
1      01           1              1            0
2      01           1              1            0
3      01           1              1            0
4      01           1              1            1
5      01           0              0            0
6      01           0              0            0
7      01           0              0            0
8      01           1              1            1
9      02           1              1            0
10     02           0              0            0
11     02           0              0            0
12     02           0              0            0
13     02           1              1            1
14     03           0              1            1
15     03           0              0            1
16     03           0              0            1
17     03           1              1            1

我想編寫一些代碼來檢測剩余 3 列中每個目標的第一行是否為 1,如果是,則將第一個 0 之前出現的所有“1”替換為“NA”。 但是,我希望它為所有 3 列單獨執行此操作,即使用 OR 邏輯而不是 AND。 這是我想要的結果:

    Target   targ2clicks  targ2midclicks targ2rClicks
1      01          NA             NA            0
2      01          NA             NA            0
3      01          NA             NA            0
4      01          NA             NA            1
5      01           0              0            0
6      01           0              0            0
7      01           0              0            0
8      01           1              1            1
9      02          NA             NA            0
10     02           0              0            0
11     02           0              0            0
12     02           0              0            0
13     02           1              1            1
14     03           0             NA           NA
15     03           0              0           NA
16     03           0              0           NA
17     03           1              1           NA

這篇文章是相關的,並擴展了之前的一篇文章: 在 R 中的值更改之前刪除某個值的行這里還有一篇類似的文章,我正在努力適應我自己的需求: 用 NA 跨多個列替換值如果在 R 中滿足條件

這是我到目前為止所嘗試的,但並不完全正確:

library(naniar)
dat1 <- dat %>%
  group_by(Target) %>%
  replace_with_na_if(.predicate = c(dat$targ2clicks[1]==1 | dat$targ2midclicks[1]==1 | dat$targ2rClicks[1]==1),
                   condition = cumany(~.x) == 0)

這給了我一個警告: Error in probe(.x, .p) : length(.p) == length(.x) is not TRUE

非常感謝任何幫助!

您可以嘗試使用cumall 這將有效地將不等於零的值轉換為NA直到第一個零。 該邏輯將給出與上述相同的結果。 但是,如果您的實際需求不同,或者您想顯式檢查給定Target的第一行以確保等於 1,則可以改為first(.) == 1 & cumall(. != 0)

library(tidyverse)

dat %>%
  group_by(Target) %>%
  mutate(across(.cols = starts_with("targ2"), 
                ~replace(., cumall(. != 0), NA)))

輸出

   Target targ2clicks targ2midclicks targ2rClicks
   <chr>        <dbl>          <dbl>        <dbl>
 1 01              NA             NA            0
 2 01              NA             NA            0
 3 01              NA             NA            0
 4 01              NA             NA            1
 5 01               0              0            0
 6 01               0              0            0
 7 01               0              0            0
 8 01               1              1            1
 9 02              NA             NA            0
10 02               0              0            0
11 02               0              0            0
12 02               0              0            0
13 02               1              1            1
14 03               0             NA           NA
15 03               0              0           NA
16 03               0              0           NA
17 03               1              1           NA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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