R - gsub 内部函数,在 DPLYR 链中调用突变给出错误



我有以下示例数据(实际数据包含具有数字和字符变量的其他列(:

structure(list(AM = structure(1:20, .Label = c("AMP_R", "AZI_R", 
"CHL_R", "CIP_R", "COL_R", "ERY_R", "ETP_R", "F.C_R", "FEP_R", 
"FOT_R", "FOX_R", "GEN_R", "IMI_R", "MERO_R", "NAL_R", "STR_R", 
"SULFA_R", "T.C_R", "TAZ_R", "TET_R"), class = "factor")), .Names = "AM", row.names = c(NA, 
-20L), class = "data.frame")

我尝试创建一个函数来检测数据框中的列是否包含结尾为"_R"的变量。如果他们这样做,它将删除此结尾并继续将变量重命名为全名,与转换表相对应。如果不存在"_R"结尾,它将直接转换名称。

我在函数的第一部分尝试了以下内容:

library(dplyr)
convert_AM_names <- function(data, col) {
    data %>%
      mutate(col = gsub("(.*?)_R", "\1", col))
}

我想在 dplyr 链中使用它,如下所示:

AM <- AM %>%
  rowwise() %>%
  convert_AM_names(., AM)

但是,当我这样做时,它会给出错误"mutate_impl(.data,点(中的错误:列"col"的长度必须为 1,而不是 20">

我看到类似的问题已经在 SO 这里得到解决,但对于他们中的大多数人来说,解决方案是使用 rowwise((,这似乎在这里不起作用。有什么建议吗?

您可以为正则表达式使用仅当_R位于末尾时才匹配的锚点

convert_AM_names <- function(col) {
  gsub("(.*)_R$", "\1", col)
}
library(dplyr)
df %>%
  mutate(AM = convert_AM_names(AM))

或直接 - 没有convert_AM_names()的开销:

df %>%
  mutate(AM = gsub("(.*)_R$", "\1", AM))

两者都将产生:

      AM
1    AMP
2    AZI
3    CHL
4    CIP
5    COL
6    ERY
7    ETP
8    F.C
9    FEP
10   FOT
11   FOX
12   GEN
13   IMI
14  MERO
15   NAL
16   STR
17 SULFA
18   T.C
19   TAZ
20   TET
您可以使用mutate_at(),它

允许您选择一列并对其应用函数。

AM %>% 
  mutate_at(.vars = "AM", 
            .funs = gsub,
            pattern = "(.*?)_R",
            replacement = "\1")

如果需要,还可以重写函数:

convert_AM_names <- function(col) {
  gsub("(.*?)_R", "\1", col)
}

并在mutate_at()中使用它:

AM %>% 
  mutate_at(.vars = "AM", 
            .funs = convert_AM_names)

在这两种情况下,结果如下所示:

      AM
1    AMP
2    AZI
3    CHL
4    CIP
5    COL
6    ERY
7    ETP
8    F.C
9    FEP
10   FOT
11   FOX
12   GEN
13   IMI
14  MERO
15   NAL
16   STR
17 SULFA
18   T.C
19   TAZ
20   TET

最新更新