我正在处理一个具有未检测到(具有不同的十进制分隔符),缺失值和测量值的数据框。我想用减号(<1变为1/2 = 0.5)后的一半值替换非检测值。
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)
您可以在步骤2中使用以下代码:
df$value = gsub(",", ".", df$value, fixed = TRUE)
它将用value
列中的文字点替换文字逗号。
然后,您可以使用该gsubfn
包来匹配和处理与正则表达式匹配的子字符串:
> 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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句