使用 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 创建
它适用于这个特定实例,您需要确保它适用于您实际应用程序的完整数据配置。
我正在尝试使用 dplyr
.
这是数据示例:
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 创建它适用于这个特定实例,您需要确保它适用于您实际应用程序的完整数据配置。