【问题标题】:Combining "mutate" and "across" from dplyr and functions from stringr结合来自 dplyr 的“mutate”和“across”以及来自 stringr 的函数
【发布时间】:2020-09-19 03:26:32
【问题描述】:

问题说明

我有一个表,其中一些列以我想删除的字符串开头。我试图通过使用 dplyr 中的新“交叉”功能和 stringr 中的函数来操作字符串来做到这一点,但我失败了(这就是我在这里的原因!)。

示例代码

library(tidyverse)

# Generate a short mock-up table
set.seed(1)
mockup <- tibble(n_col1 = sample(1:10, 5, FALSE),
                 v_col2 = sample(letters, 5, FALSE),
                 col3 = sample(10:20, 5, TRUE),
                 col4 = sample(LETTERS, 5, FALSE)) # More columns beginning with "n_", "v_" or nothing

# Remove the "n_" or "v_" strings from the column names
# This is as far as my skills go...
mockup <- mockup %>% mutate(across(starts_with(c("n_", "v_")), str_remove))

问题

任何想法如何以我的方式或以不同的方式以简短有效的方式做到这一点?

【问题讨论】:

    标签: r dplyr stringr


    【解决方案1】:

    across 用于操作列中的值而不是列名。您可以使用新的rename_with 重命名列。

    library(dplyr)
    mockup %>%  rename_with(~sub('^(n|v)_', '', .))
    #rename_all in old dplyr
    #mockup %>%  rename_all(~sub('^(n|v)_', '', .))
    
    #   col1 col2   col3 col4 
    #  <int> <chr> <int> <chr>
    #1     9 w        10 N    
    #2     4 k        14 J    
    #3     7 n        14 G    
    #4     1 r        19 I    
    #5     2 s        15 O    
    

    或者在基础 R 中这样做:

    names(mockup) <- sub('^(n|v)_', '', names(mockup))
    

    【讨论】:

    • 伟大、简单、高效的答案!谢谢
    【解决方案2】:

    我们可以使用str_removedplyr

    library(dplyr)
    library(stringr)
    mockup %>%
        rename_with(~ str_remove(., '^[nv]_'))
    # A tibble: 5 x 4
    #   col1 col2   col3 col4 
    #  <int> <chr> <int> <chr>
    #1     9 w        10 N    
    #2     4 k        14 J    
    #3     7 n        14 G    
    #4     1 r        19 I    
    #5     2 s        15 O   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 2021-02-04
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多