使用 dplyr 有条件地将一个 column/row 中的值替换为另一个 row/column 中的值

Conditionally replace values in one column/row with values from another row/column using dplyr

我正在尝试使用 dplyr.

有条件地将一个 column/row 中的值替换为另一个 column/row 中的值

这是数据示例:

  id          colours tagl  TAGLFT grid
  <fct>       <chr>   <chr> <chr> <chr>
  6391        B*/Y*   45820 45820  KL 
  6391        B*/Y*   45820 46272  KL
  8443        B*/Y*   46272 46272  SU

我可以使用以下代码在行内成功替换:

updated<-df %>%
    mutate(tagl=ifelse(!tagl==TAGLFT, TAGLFT, tagl))

我查找 tagl==TAGLFT 所在的任何行,然后将 tagl 值替换为 TAGLFT 值。然后,如果该条件为真(即发生替换),我还需要用正确的 id 替换 id 列(这些值在不同的行中找到)。

这是我想要的:

  id          colours tagl  TAGLFT grid
  <fct>       <chr>   <chr> <chr> <chr>
  6391        B*/Y*   45820 45820  KL 
  8443        B*/Y*   46272 46272  KL
  8443        B*/Y*   46272 46272  SU

关于如何跨行工作有什么建议吗?我主要在 dplyr.

工作

这个怎么样:

  library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
dat <- tibble::tribble(~id,          ~colours, ~tagl,  ~TAGLFT, ~grid,
"6391",        "B*/Y*",   "45820", "45820",  "KL", 
"6391",        "B*/Y*",   "45820", "46272",  "KL",
"8443",        "B*/Y*",   "46272", "46272",  "SU")

updated<-dat %>%
  mutate(tagl=ifelse(!tagl==TAGLFT, TAGLFT, tagl)) 

dat %>%
  filter(tagl == TAGLFT) %>% 
  select(TAGLFT, id) %>% 
  right_join(updated %>% select(-id)) %>% 
  select(id, colours, tagl, TAGLFT, grid)
#> Joining, by = "TAGLFT"
#> # A tibble: 3 × 5
#>   id    colours tagl  TAGLFT grid 
#>   <chr> <chr>   <chr> <chr>  <chr>
#> 1 6391  B*/Y*   45820 45820  KL   
#> 2 8443  B*/Y*   46272 46272  KL   
#> 3 8443  B*/Y*   46272 46272  SU

reprex package (v2.0.1)

于 2022-04-05 创建

它适用于这个特定实例,您需要确保它适用于您实际应用程序的完整数据配置。