编写一个函数,该函数在 str_remove 中同时读取 y 列和文本“y”

Writing a function that reads both column y and text "y" in str_remove

提问人:Catherine 提问时间:11/1/2023 更新时间:11/1/2023 访问量:30

问:

我正在用 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 的文本?

谢谢!

r 字符串 函数 dplyr stringr

评论

0赞 knitz3 11/1/2023
这个 dplyr 文档有一些关于为什么你的函数不起作用的好信息: dplyr.tidyverse.org/articles/programming.html - 公认的答案是一种更好的方法,不需要改变。但是在文档中,“胶水”和“拥抱”语法在某些情况下会有所帮助,例如,''' remove_weird_letter <- function(data, LETTER) { mutate(data, “{LETTER}” := str_remove(data[[LETTER]], paste0(“^”, LETTER, “_”))) } df %>% remove_weird_letter(., “y”) '''

答:

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完成,请参阅编辑。