【问题标题】:Remove everything except period and numbers from string regex in R从 R 中的字符串正则表达式中删除除句点和数字之外的所有内容
【发布时间】:2016-08-14 17:13:00
【问题描述】:

我知道关于正则表达式的堆栈溢出有很多问题,但我无法通过我所看到的可用帮助完成这项简单的任务。这是我的数据:

a<-c("Los Angeles, CA","New York, NY", "San Jose, CA")
b<-c("c(34.0522, 118.2437)","c(40.7128, 74.0059)","c(37.3382, 121.8863)")

df<-data.frame(a,b)
df
                a                    b
1 Los Angeles, CA c(34.0522, 118.2437)
2    New York, NY  c(40.7128, 74.0059)
3    San Jose, CA c(37.3382, 121.8863)

我想删除除数字和句点之外的所有内容(即删除“c”、“)”和“(”。这是我迄今为止尝试过的:

str_replace(df$b,"[^0-9.]","" )
[1] "(34.0522, 118.2437)" "(40.7128, 74.0059)"  "(37.3382, 121.8863)"

str_replace(df$b,"[^\\d\\)]+","" )
[1] "34.0522, 118.2437)" "40.7128, 74.0059)"  "37.3382, 121.8863)"

不确定还有什么可以尝试的。我想得到以下结果:

 [1] "34.0522, 118.2437" "40.7128, 74.0059"  "37.3382, 121.8863"

谢谢。

【问题讨论】:

  • 为什么你有R代码作为文本?这看起来像一个 XY 问题。
  • 我认为将它作为列表而不是再次存储为字符串可能会更好。即lapply(str_extract_all(df$b, "[0-9.]+"), as.numeric)
  • 不知道为什么代码是这样的,我写了一个批量地理编码的函数,由于某种原因它偶尔会吐出一个我转置的数据帧,转置函数会创建这个奇怪的“r代码作为文本”问题。更奇怪的是,它并没有对所有数据集都这样做。我将一个数据帧分成两半,并在 1 上运行批处理地理编码,在另一个上运行批处理地理编码,原始数据集的前半部分转置很好,但后半部分创建了这个奇怪的特征。我已经问了将近六个人这个问题,没有人能弄清楚。
  • @akrun 我的最终产品需要是一个包含三列的数据框,城市名称,然后是两列——一列代表纬度,一列代表经度。我希望在堆栈溢出的优秀人员的帮助下,我可以克服剥离不必要字符的第一个障碍,然后我将在两个坐标之间的空间将列分成两部分。
  • @CyrusMohammadian 如果你需要它作为两列cbind(df[1], do.call(rbind, lapply(str_extract_all(df$b, "[0-9.]+"), as.numeric)))

标签: regex r string stringr


【解决方案1】:

如果我理解正确,这就是你想要的:

df$b <- gsub("[^[:digit:]., ]", "", df$b)

或:

df$b <- strsplit(gsub("[^[:digit:]. ]", "", df$b), " +")
> df
                a                 b
1 Los Angeles, CA 34.0522, 118.2437
2    New York, NY  40.7128, 74.0059
3    San Jose, CA 37.3382, 121.8863

或者如果你想要所有的“数字”作为一个数字向量:

as.numeric(unlist(strsplit(gsub("[^[:digit:]. ]", "", df$b), " +")))
[1]  34.0522 118.2437  40.7128  74.0059  37.3382 121.8863

【讨论】:

    【解决方案2】:

    试试这个

    gsub("[\\c|\\(|\\)]", "",df$b)
    #[1] "34.0522, 118.2437" "40.7128, 74.0059"  "37.3382, 121.8863"
    

    【讨论】:

      【解决方案3】:

      不是正则表达式解决方案,而是一个简单的解决方案。

      b 的元素是 R 表达式,所以循环遍历每个元素,解析它,然后创建你想要的字符串。

      vapply(
        b, 
        function(bi) 
        {
          toString(eval(parse(text = bi)))
        }, 
        character(1)
      )
      

      【讨论】:

      • 尝试了以下方法:vapply( df$b, function(bi) { toString(eval(parse(text = bi))) }, character(1) ) 并得到了"1" "3" "2"
      • df$bfactor。使用stringsAsFactors = FALSE,或使用as.character 将列强制转换为字符。
      【解决方案4】:

      这是来自stringrstr_extract_all 的另一个选项。使用str_extract_all将数字部分提取为list,转换为numericrbindlist元素和cbind它的第一列'df'

      library(stringr)
      cbind(df[1], do.call(rbind, 
            lapply(str_extract_all(df$b, "[0-9.]+"), as.numeric)))
      

      【讨论】:

        猜你喜欢
        • 2011-10-16
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-11
        • 1970-01-01
        • 1970-01-01
        • 2012-02-27
        相关资源
        最近更新 更多