【问题标题】:R How to perform math operation on Regular Expression matchesR如何对正则表达式匹配执行数学运算
【发布时间】:2017-01-13 10:56:47
【问题描述】:

我正在处理一个包含未检测(使用不同的小数分隔符)、缺失值和测量值的数据框。 我想用减号后的一半值替换未检测到的值(

1) 我将导入的数据框转换为字符。

df = data.frame(value=c("NA", "1.2", "<1.0", "<6,6"))

1) 将因子转换为字符

  df <- data.frame(lapply(df, as.character), stringsAsFactors=FALSE)

2)我将所有“,”替换为“。”

 pattern = ","
 grep(pattern, df, value = TRUE)
 df <- data.frame(lapply(df, function(x) {gsub(pattern=pattern, replacement=".", x, perl = TRUE)}))

3)我可以找到所有未检测到的,我可以用减号后面的值替换它

 pattern = "(^<)(\\d+)"
 grep(pattern, df, value = TRUE)
 df <- data.frame(lapply(df, function(x) {gsub(pattern=pattern, replacement="\\d", x, perl = TRUE)}))

我找不到如何对匹配的替换字符串执行数学运算,例如:

 replacement = as.character((as.numeric("\\2"))/2)

【问题讨论】:

  • 对不起,你到底想得到什么?将所有前面没有&lt; 的数字除以2?为什么替换中有正则表达式模式?在那里,您只能使用替换模式,不能在替换模式中使用\d 类似的模式。
  • 您的描述不太清楚,您能否添加一些数据例如并澄清您的要求?
  • 第 2 步:df$value = gsub(",", ".", df$value, fixed = TRUE)。然后是library(gsubfn),然后是gsubfn("(^|[^&lt;\\d.])(\\d*\\.?\\d+)", function(x,y) paste0(x,as.numeric(y)/2), df$value),对吧?
  • ?试图获得这样的数据框df = data.frame(value=c("NA", "1.2", "0.5", "3.3"))
  • @Wiktor Stribiżew 我将您的建议代码更改为gsubfn("(^&lt;)(\\d*\\.?\\d+)", function(x,y) paste0(as.numeric(y)/2), df$value)

标签: r regex dataframe


【解决方案1】:

您可以在第 2 步中使用以下代码:

df$value = gsub(",", ".", df$value, fixed = TRUE)

它将在value 列中用文字点替换文字逗号。

然后,您可以使用gsubfn package 来匹配和操作与正则表达式匹配的子字符串:

> library(gsubfn)
> df$value = gsubfn("^<(\\d*\\.?\\d+)", ~ as.numeric(x)/2, df$value)
> df
  value
1    NA
2   1.2
3  0.5
4  3.3

这里,^&lt;(\\d*\\.?\\d+) 将匹配字符串开头的&lt;\\d*\\.?\\d+ 模式将匹配任何浮点/整数值并将其捕获到第 1 组,并稍后在回调函数中将其除以 2。

【讨论】:

    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2011-11-14
    相关资源
    最近更新 更多