【问题标题】:How do I replace values in certain columns conditional on a certain value in corresponding columns?如何根据相应列中的特定值替换特定列中的值?
【发布时间】:2022-12-31 08:25:08
【问题描述】:

我有以下数据框:

`1_X94` <- c("apple", "lemon", "orange")
`2_X94` <- c("apple", "strawberry", "lemon")
`1_X09` <- c(1, 2, 3)
`2_X09` <- c(4, 5, 6)
`1_X38` <- c("red", "yellow", "orange")
`2_X38` <- c("red", "red", "yellow")
                    
df <- data.frame(`1_X94`, `2_X94`, `1_X09`, `2_X09`, `1_X38`, `2_X38`)

我有第二个数据框:

fruit <- c("apple", "watermelon")
fruit_list <- data.frame(fruit)

我想要完成的是,只要有一个列名的正则表达式模式为 ^\d+_X94?,其值与 fruit_list 数据框匹配,它就会用 ^\d+_X38 的正则表达式模式替换列名“绿色。”

我目前有以下代码,但我想添加一些自动化方面,这样我就不必列出 str_detect() 中的所有水果并为 X1、X2 等创建多个 mutate 命令。

library(tidyverse)
library(stringr)
df <- df %>%
  mutate(
    X1_X38 = case_when(
      str_detect(X1_X94, "apple|watermelon") ~ "green",
      TRUE ~ .$X1_X38
    )
  ) %>%
  mutate(
    X2_X38 = case_when(
      str_detect(X2_X94, "apple|watermelon") ~ "green",
      TRUE ~ .$X2_X38
    )
  )

任何指导将不胜感激。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    这是一个选项。您对所有感兴趣的列进行变异,然后将水果绑定为带有“|”的模式:

    library(tidyverse)
    
    df |>
      mutate(across(ends_with("_X94"), ~ifelse(
        grepl(paste(fruit_list$fruit, collapse = "|"), .), "green", .)))
    #>   X1_X94     X2_X94 X1_X09 X2_X09 X1_X38 X2_X38
    #> 1  green      green      1      4    red    red
    #> 2  lemon strawberry      2      5 yellow    red
    #> 3 orange      lemon      3      6 orange yellow
    

    【讨论】:

    • 我现在看到这与您的要求略有不同。我现在正在更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多