我正在处理一个未检测到(具有不同的小数分隔符),缺失值和测量值的数据帧。 我希望在较小符号(< 1变为1/2 = 0.5)之后用非一半的值替换非检测。
1)我将导入的数据帧转换为charactes。
df = data.frame(value=c("NA", "1.2", "<1.0", "<6,6"))
1)将因子转换为字符
df <- data.frame(lapply(df, as.character), stringsAsFactors=FALSE)
2)我替换所有&#34;,&#34;到&#34;。&#34;
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)
答案 0 :(得分:3)
您可以在步骤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
此处,^<(\\d*\\.?\\d+)
将匹配字符串开头的<
,\\d*\\.?\\d+
模式将匹配,并将任意浮点数/整数值捕获到第1组中,稍后将其除以2回调函数。