Str_Detect 使用跨列检测多列

CGP*_*CGP 4 r dplyr

我想根据str_detect使用跨多个列的结果创建一个新列across

例如,在下面的测试数据中,我想在以“job”开头的列中搜索“No job”,如果在任何列中检测到该字符串,则返回 1,如果未检测到,则返回 0。

test_data <-  data.frame("job1" = c('Sales','Baker','Blacksmith','Brewer'), 
                         "job2" = c('Mailman','Jockey','Jobhunter',"No job"),
                         "id" = c("id_1", "id_2", "id_3", "id_4"))

# Output I'd like:

#         job1      job2   id no_job
#1      Sales   Mailman id_1      0
#2      Baker    Jockey id_2      0
#3 Blacksmith Jobhunter id_3      0
#4     Brewer    No job id_4      1

Run Code Online (Sandbox Code Playgroud)

我知道我可以unite以“job”开头的列,然后str_detect在新列上使用,如下所示:

test_data2 <- test_data %>%
    unite(col = "all_jobs", starts_with("job"), sep = ", ", remove = FALSE) %>%
    mutate(no_job = if_else(str_detect(all_jobs, "No job"), 1, 0))
Run Code Online (Sandbox Code Playgroud)

...但我想知道是否有一种方法可以用来across做同样的事情。我尝试过以下的变体,但还没有成功。

test_data2 <- test_data %>%
    mutate(no_job = if_else(across(starts_with("job"), str_detect(., "No job")), 1, 0))
Run Code Online (Sandbox Code Playgroud)

tmf*_*mnk 9

一种选择可能是:

test_data %>%
 rowwise() %>%
 mutate(no_job = +any(str_detect(c_across(-id), "No job")))

  job1       job2      id    no_job
  <fct>      <fct>     <fct>  <int>
1 Sales      Mailman   id_1       0
2 Baker      Jockey    id_2       0
3 Blacksmith Jobhunter id_3       0
4 Brewer     No job    id_4       1
Run Code Online (Sandbox Code Playgroud)

  • 如果“No job”出现在多列中,您可以使用 `mutate(no_job = as.numeric(any(str_detect(c_across(-id), "No job"))))` (2认同)
  • 那个 `mutate()` 中的 `+` 是怎么回事?您能解释一下吗?我从来没有遇到过这种情况,我很好奇!! (2认同)
  • @Dunois它与`as.numeric()`相同,即它只是将逻辑向量转换为数值向量。 (2认同)