如何在 R 中的整个数据帧上使用正则表达式

How to use regex over entire dataframe in R

R 的新用户所以请放轻松。

我有这样的数据框:

   df = data.frame(Mineral = c("Zfeldspar", "Zgranite", "ZSilica"),
                     Confidence = c("ZLow", "High", "Med"),
                     Coverage = c("sub", "sub", "super"),
                     Aspect = c("ZPos", "ZUnd", "Neg"))

实际文件要大得多并且是从旧硬件输出的。由于某些原因,一些条目前面有 "Z"。如何从整个数据集中删除?

我试过 df = gsub("Z", " ", df) 但它让我胡说八道。这该死的东西!

[1] "1:3" "c(3, 1, 2)" "c(1, 1, 2)" "c(2, 3, 1)"

在 Whosebug 上查看并尝试了 stringr 包,但也无法开始工作。有人知道该怎么办吗?

您可以按以下方式使用简单的 ^Z 正则表达式:

df = data.frame(Mineral = c("Zfeldspar", "Zgranite", "ZSilica"),
                      Confidence = c("ZLow", "High", "Med"),
                      Coverage = c("sub", "sub", "super"),
                      Aspect = c("ZPos", "ZUnd", "Neg"))
df[] <- lapply(df, sub, pattern = '^Z',  replacement ="")
> df
   Mineral Confidence Coverage Aspect
1 feldspar        Low      sub    Pos
2  granite       High      sub    Und
3   Silica        Med    super    Neg

^Z模式用^锚点匹配字符串的开头,然后Z使用sub匹配和删除(因为只有一种可能在每个字符串中匹配使用 gsub).

没有意义

你很接近。如果你想使用 base gsub

data$Mineral = gsub("Z", "", data$Mineral)

您可以对所有列执行此操作。或者结合使用 apply 策略(参见其他答案!)

PS。将数据命名为 data 不是一个好主意。至少做 my_data

你可以这样做:

as.data.frame(sapply(data, function(x) {gsub("Z", "", x)}))

您使用 gsub() 的方法不起作用,因为该函数对矢量而不是数据帧进行操作。但是,您可以 apply gsub() 遍历数据框的每一列以获得您想要的内容:

df[] <- lapply(df, function (x) {gsub("Z", "", x)})

对于 stringr 解决方案(也使用 dplyr),尝试:

library(tidyverse)

df <- mutate_all(df,
                   funs(str_replace_all(., "Z", "")))

P.S。我建议以后使用 df <- 而不是 df =。祝你好运!

编辑:更正错字 - 感谢@thelatemail

您询问了如何在 stringr(/stringi) 包中执行此操作,以避免获得不需要的索引向量:

> as.data.frame(apply(df, 2,
      function(col) stringr::str_replace_all(col, '^Z', '')))
> as.data.frame(apply(df, 2,
      function(col) stringi::stri_replace_first_regex(col, '^Z', '')))

   Mineral Confidence Coverage Aspect
1 feldspar        Low      sub    Pos
2  granite       High      sub    Und
3   Silica        Med    super    Neg

(需要调用 as.data.frame() 将输出数组转回 df R: apply-like function that returns a data frame? )

至于弄清楚如何在整个数据帧上调用 str*_replace 函数,我试过...

  • 整个df:stri_replace_first_fixed(df, '^Z', '')
  • 按行:stri_replace_first_fixed(df[1,], '^Z', '')
  • 按列stri_replace_first_fixed(df[,1], '^Z', '')

只有最后一个可以正常使用。不可否认 str*_replace 上的设计缺陷,它们至少应该识别无效对象并产生有用的错误消息,而不是喷出索引。