使用case_when和str_split的组合来突变数据帧中的列

时间:2018-10-11 04:22:45

标签: r dplyr stringr

我正在尝试使用感兴趣的包中的函数名称创建一个数据框。我设法通过以下方式做到这一点:

# loading needed libraries
library(ggstatsplot)
library(tidyverse)

# creating a dataframe with namespace from package of interest
(
  df_ns <- getNamespaceExports(ns = "ggstatsplot") %>%
    tibble::as_data_frame(.) %>%
    dplyr::filter(.data = ., grepl("^gg|^grouped", value)) %>%
    dplyr::filter(.data = ., value != "ggcoefstats") %>%
    dplyr::mutate(
      .data = .,
      functions = paste("ggstatsplot::", value, sep = "")
    ) %>%
    dplyr::mutate(
      .data = .,
      version = dplyr::case_when(grepl("^grouped", value) ~ "grouped",
                                 TRUE ~ "basic")
    )
)
#> # A tibble: 10 x 3
#>    value                  functions                           version
#>    <chr>                  <chr>                               <chr>  
#>  1 grouped_gghistostats   ggstatsplot::grouped_gghistostats   grouped
#>  2 grouped_ggscatterstats ggstatsplot::grouped_ggscatterstats grouped
#>  3 grouped_ggbetweenstats ggstatsplot::grouped_ggbetweenstats grouped
#>  4 grouped_ggcorrmat      ggstatsplot::grouped_ggcorrmat      grouped
#>  5 grouped_ggpiestats     ggstatsplot::grouped_ggpiestats     grouped
#>  6 ggbetweenstats         ggstatsplot::ggbetweenstats         basic  
#>  7 ggpiestats             ggstatsplot::ggpiestats             basic  
#>  8 ggcorrmat              ggstatsplot::ggcorrmat              basic  
#>  9 gghistostats           ggstatsplot::gghistostats           basic  
#> 10 ggscatterstats         ggstatsplot::ggscatterstats         basic

到目前为止,一切都很好。现在我想要的是以下内容:
我想从列grouped_中的所有名称(前五行,即)中删除value前缀。但是,当我尝试使用str_split进行此操作时,将为所有名称分配"gghistostats"而不是5个不同的名称。我该怎么办?

# stripping `grouped_` prefix from `value` column
df_ns %>%
  dplyr::mutate(
    .data = .,
    value = dplyr::case_when(
      grepl("^grouped", value) ~ stringr::str_split(value, "_")[[1]][[2]],
      TRUE ~ value
    )
  )
#> # A tibble: 10 x 3
#>    value          functions                           version
#>    <chr>          <chr>                               <chr>  
#>  1 gghistostats   ggstatsplot::grouped_gghistostats   grouped
#>  2 gghistostats   ggstatsplot::grouped_ggscatterstats grouped
#>  3 gghistostats   ggstatsplot::grouped_ggbetweenstats grouped
#>  4 gghistostats   ggstatsplot::grouped_ggcorrmat      grouped
#>  5 gghistostats   ggstatsplot::grouped_ggpiestats     grouped
#>  6 ggbetweenstats ggstatsplot::ggbetweenstats         basic  
#>  7 ggpiestats     ggstatsplot::ggpiestats             basic  
#>  8 ggcorrmat      ggstatsplot::ggcorrmat              basic  
#>  9 gghistostats   ggstatsplot::gghistostats           basic  
#> 10 ggscatterstats ggstatsplot::ggscatterstats         basic

reprex package(v0.2.1)于2018-10-11创建

2 个答案:

答案 0 :(得分:1)

尝试使用sub

df_ns$value <- sub("^grouped_", "", df_ns$value)

或使用捕获组:

df_ns$value <- sub("^grouped_(.*)", "\\1", df_ns$value, perl=TRUE)

答案 1 :(得分:1)

我们可以使用str_remove

library(stringr)
library(dplyr)
df_ns %>%
     mutate(value = str_remove(value, "^grouped_"))