簡體   English   中英

如何使用 R 中的跨函數更改多列中的值?

[英]How to change values in multiple columns using the across function in R?

我有一個數據框,我想在其中遍歷所有以_qc結尾的列,如果值為“4”,則將 NA 設置為沒有_qc后綴的相應列。

例如,如果名為chla_adjusted_qc == 4的列的值, chla_adjusted的值設置為 NA。

library(tidyverse)


df <- tibble(
  chla_adjusted = c(100, 2),
  chla_adjusted_qc = c("4", "1"),
  bbp_adjusted = c(0.1, 9999),
  bbp_adjusted_qc = c("2", "4")
)

df
#> # A tibble: 2 × 4
#>   chla_adjusted chla_adjusted_qc bbp_adjusted bbp_adjusted_qc
#>           <dbl> <chr>                   <dbl> <chr>          
#> 1           100 4                         0.1 2              
#> 2             2 1                      9999   4

所需的輸出將是

tibble(
  chla_adjusted = c(NA, 2),
  chla_adjusted_qc = c("4", "1"),
  bbp_adjusted = c(0.1, NA),
  bbp_adjusted_qc = c("2", "4")
)
#> # A tibble: 2 × 4
#>   chla_adjusted chla_adjusted_qc bbp_adjusted bbp_adjusted_qc
#>           <dbl> <chr>                   <dbl> <chr>          
#> 1            NA 4                         0.1 2              
#> 2             2 1                        NA   4

到目前為止我所做的是獲取當前列名並找到我要在其中設置 NA 值的相應列。

df |>
  mutate(across(ends_with("_qc"), \(var) {
    # If var is chla_adjusted_qc, then lets modify the value in chla_adjusted
    col <- str_remove(cur_column(), "_qc")

    # if (var == "4") {
    #   # What to do here?
    # }
  }))
#> # A tibble: 2 × 4
#>   chla_adjusted chla_adjusted_qc bbp_adjusted bbp_adjusted_qc
#>           <dbl> <chr>                   <dbl> <chr>          
#> 1           100 chla_adjusted             0.1 bbp_adjusted   
#> 2             2 chla_adjusted          9999   bbp_adjusted

謝謝你。

創建於 2022-12-20,使用reprex v2.0.2

df %>%
  mutate(across(ends_with("_qc"),
                ~ replace(cur_data()[[ sub("_qc$", "", cur_column()) ]], . == 4L, NA),
                .names = "{sub('_qc$', '', .col)}"))
# # A tibble: 2 × 4
#   chla_adjusted chla_adjusted_qc bbp_adjusted bbp_adjusted_qc
#           <dbl> <chr>                   <dbl> <chr>          
# 1            NA 4                         0.1 2              
# 2             2 1                        NA   4              

基礎 R 解決方案:

for(v in grep("_qc$",names(df), value=TRUE)){
  df[[sub("_qc$","",v)]][df[[v]]==4] <- NA
}


> df
# A tibble: 2 × 4
  chla_adjusted chla_adjusted_qc bbp_adjusted bbp_adjusted_qc
          <dbl> <chr>                   <dbl> <chr>          
1            NA 4                         0.1 2              
2             2 1                        NA   4              
> 

我們可以使用across2中的dplyover

library(dplyover)
df %>% 
   mutate(across2(ends_with('adjusted'), ends_with('_qc'), 
    ~ case_when(.y !=4 ~ .x ), .names = "{xcol}"))

-輸出

# A tibble: 2 × 4
  chla_adjusted chla_adjusted_qc bbp_adjusted bbp_adjusted_qc
          <dbl> <chr>                   <dbl> <chr>          
1            NA 4                         0.1 2              
2             2 1                        NA   4         

暫無
暫無

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

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