结合来自 dplyr 的 "mutate" 和 "across" 以及来自 stringr 的函数
Combining "mutate" and "across" from dplyr and functions from stringr
问题陈述
我有一个 table,其中一些列以我想删除的字符串开头。我试图通过使用 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))
问题
有没有关于如何以我的方式或其他方式以简短高效的方式做到这一点的想法?
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
或者在 base R 中这样做:
names(mockup) <- sub('^(n|v)_', '', names(mockup))
我们可以使用 str_remove
和 dplyr
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
问题陈述
我有一个 table,其中一些列以我想删除的字符串开头。我试图通过使用 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))
问题
有没有关于如何以我的方式或其他方式以简短高效的方式做到这一点的想法?
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
或者在 base R 中这样做:
names(mockup) <- sub('^(n|v)_', '', names(mockup))
我们可以使用 str_remove
和 dplyr
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