提问人:Catherine 提问时间:11/1/2023 更新时间:11/1/2023 访问量:30
编写一个函数,该函数在 str_remove 中同时读取 y 列和文本“y”
Writing a function that reads both column y and text "y" in str_remove
问:
我正在用 R 编写一个函数,用于一些代码清理,涉及删除字符串中的一些文本。我有以下数据帧:
x <- c(1, 2, 3, 4, 5)
y <-c("y_a","y_b","y_c","y_d","y_e")
z <-c("z_f","z_g","z_h","z_i","z_j")
df <- (x, y, z)
我正在尝试分别清除 y 和 z 列的 y_ 和 z_。
通常我会把它写成
df <- df %>%
mutate(y=str_remove(y,"y_"))
但是我想写一个函数,这样我就可以重复了。现在我的函数如下所示:
remove_weird_letter <- function(LETTER) {
mutate(LETTER=str_remove(LETTER,"LETTER_"))
}
df <- remove_weird_letter(y)
df <- remove_weird_letter(z)
但是它不会将“LETTER”视为对函数中对象的引用,因此它不会删除它需要的内容。如何修改我的语法,以便它知道同时引用名为 LETTER 的列和包含 LETTER 的文本?
谢谢!
答:
1赞
Rui Barradas
11/1/2023
#1
这是一种方法。
该函数接受一列,并删除所有内容,包括字符串开头的第一个下划线。
给出了三个例子。
suppressPackageStartupMessages(
library(dplyr)
)
remove_weird_letter <- function(x) {
pattern <- "^[^_]+_"
stringr::str_remove(x, pattern)
}
x <- c(1, 2, 3, 4, 5)
y <-c("y_a","y_b","y_c","y_d","y_e")
z <-c("z_f","z_g","z_h","z_i","z_j")
x827402 <- paste0("x827402_", 1:5)
x19538 <- paste0("x19538_", 1:5)
x300004192 <- paste0("x300004192_", 1:5)
df <- data.frame(x, y, z, x827402, x19538, x300004192)
# remove column name from one column
df %>%
mutate(y = remove_weird_letter(y))
#> x y z x827402 x19538 x300004192
#> 1 1 a z_f x827402_1 x19538_1 x300004192_1
#> 2 2 b z_g x827402_2 x19538_2 x300004192_2
#> 3 3 c z_h x827402_3 x19538_3 x300004192_3
#> 4 4 d z_i x827402_4 x19538_4 x300004192_4
#> 5 5 e z_j x827402_5 x19538_5 x300004192_5
# remove column names from several columns
df %>%
mutate(across(y:x300004192, ~ remove_weird_letter(.x)))
#> x y z x827402 x19538 x300004192
#> 1 1 a f 1 1 1
#> 2 2 b g 2 2 2
#> 3 3 c h 3 3 3
#> 4 4 d i 4 4 4
#> 5 5 e j 5 5 5
# remove column names from several columns
df %>%
mutate(across(y:x300004192, ~ remove_weird_letter(.x)))
#> x y z x827402 x19538 x300004192
#> 1 1 a f 1 1 1
#> 2 2 b g 2 2 2
#> 3 3 c h 3 3 3
#> 4 4 d i 4 4 4
#> 5 5 e j 5 5 5
# remove column names from columns starting with "x"
df %>%
mutate(across(starts_with("x"), ~ remove_weird_letter(.x)))
#> x y z x827402 x19538 x300004192
#> 1 1 y_a z_f 1 1 1
#> 2 2 y_b z_g 2 2 2
#> 3 3 y_c z_h 3 3 3
#> 4 4 y_d z_i 4 4 4
#> 5 5 y_e z_j 5 5 5
创建于 2023-10-31 使用 reprex v2.0.2
评论
0赞
Catherine
11/1/2023
如果字符串开头的字符数不固定,有没有办法做到这一点?不需要的字符将始终位于开头,但在我正在使用的实际数据集中,“y”可能是“x827402”或“x19538”或“x300004192”(但它始终与列名匹配!
0赞
Rui Barradas
11/1/2023
@Catherine 要删除的字符串始终与列名匹配,这一点很重要。你能用你的评论文本编辑问题,让它使问题更清晰吗?
0赞
Rui Barradas
11/1/2023
@Catherine完成,请参阅编辑。
评论