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

时间:2018-04-19 22:48:48

标签: r regex dataframe stringr

新用户到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)"

在这里查看stackoverflow并尝试了stringr包,但也无法开始工作。谁知道该怎么办?

5 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:1)

您可以通过以下方式使用简单的^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}。

答案 2 :(得分:0)

你很亲密。如果您想使用基础gsub

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

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

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

答案 3 :(得分:0)

你可以这样做:

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

答案 4 :(得分:0)

你问过如何在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上存在设计缺陷,他们至少应该识别无效对象并产生有用的错误信息,而不是喷出索引。