tidyr separate_rows 与用户定义的函数? (r / tidyverse)

tidyr separate_rows with user defined function? (r / tidyverse)

separate_rows根据列值分成多行,重复其他列的值。

> t <- tibble(x = c("a,b", "c,d"), v = c(1,2))
> t %>% separate_rows(x, sep = ",")
# A tibble: 4 × 2
  x         v
  <chr> <dbl>
1 a         1
2 b         1
3 c         2
4 d         2

但是,如果我想在它上面应用一个函数怎么办?例如,在分开之后,如果在 ("a", "b") 中,则将 x 的值更改为 true,否则为 false。

我知道我需要做的就是跟随 separate_rows 进行变异。我的问题是是否已经有一个函数可以分离和处理逗号分隔值。如何以与 separate_rows 类似的方式使用该函数? (原因是我想将复杂的拆分逻辑分离到一个函数中而不是在 mutate 中)

例如,下面的示例执行上面的逻辑和 return 值向量。是否可以作为单独的行执行类似的操作? (即拆分列并重复行值)

proc <- function(text){
  text %>% 
    str_split(pattern = ",") %>%
    unlist() %>%
    sapply(function(x){
            if(x %in% c("a", "b")) 
              return(T) 
            else 
              return(F)
          })
}

有点

如果您将函数(此处 proc)的输出保留为列表形式而不是 unlisting,则可以将该函数应用到 xmutate然后 unnest x。将其保持在列表形式会保留有关 proc(t$x) 的哪个元素对应于 t 的哪一行的信息,并且当您 unlist.

时该信息将丢失
library(tidyr)
library(stringr)
library(dplyr, warn.conflicts = FALSE)

proc <- function(text) {
  text %>%
    str_split(pattern = ",") %>%
    lapply(function(x) {
      x %in% c("a", "b")
    })
}

t <- tibble(x = c("a,b", "c,d"), v = c(1,2))

t %>% 
  mutate(x = proc(x)) %>% 
  unnest(x)
#> # A tibble: 4 × 2
#>   x         v
#>   <lgl> <dbl>
#> 1 TRUE      1
#> 2 TRUE      1
#> 3 FALSE     2
#> 4 FALSE     2

reprex package (v2.0.1)

于 2022-02-20 创建

但是,如果您无论如何都要使用两个函数(mutateunnest),您最好先使用 separate_rows,然后再使用 mutate

或者,您可以将所有内容打包到 proc 函数中。

library(tidyr)
library(stringr)
library(dplyr, warn.conflicts = FALSE)

proc <- function(df, col) {
  fun <- function(text) {
    text %>%
      str_split(pattern = ",") %>%
      lapply(function(x) {
        x %in% c("a", "b")
      })
  }
  df %>% 
    mutate(across({{ col }}, fun)) %>% 
    unnest({{ col }})
}

t <- tibble(x = c("a,b", "c,d"), v = c(1,2))

t %>% 
  proc(x)
#> # A tibble: 4 × 2
#>   x         v
#>   <lgl> <dbl>
#> 1 TRUE      1
#> 2 TRUE      1
#> 3 FALSE     2
#> 4 FALSE     2

reprex package (v2.0.1)

于 2022-02-20 创建