【问题标题】:Replacing multiple data columns below threshold替换低于阈值的多个数据列
【发布时间】:2018-01-29 23:21:54
【问题描述】:

我正在尝试导入一个大型的化学分析环境数据集。该数据集组织如下:

  • 首先10 columns 是样本信息(例如实验室、监测站、日期、坐标等)。
  • 随后的(more than 90 columns) 是对不同变量(例如铝、pH、铜等)的观察结果

最大的问题是左删失数据被写成"< 0.02",每个参数的这个值是不同的。当我导入csv 文件时,其中至少有一个左删失值的所有列都被导入为Factor datatype。我想用一个基本规则替换每一个左审查:

 - Replace "< X" for value "X/sqrt(2)".

这只是一个示例,说明我最初希望如何管理这些数据。更换每根色谱柱是不可行的,因为参数太多,即使在相同的参数和实验室内(假设实验室设备更新),阈值也可能会有所不同。

提前谢谢你。

注意:为了更具体,我上传了我的数据集的摘录。 可在此处获得: http://www.filehosting.org/file/details/722215/sample.csv

【问题讨论】:

  • 这种策略的缺点是值“
  • 我是 R 新手。理论上,我可以考虑在一个函数中识别以“
  • 您的评论令人困惑。它表明我们还不知道您的数据当前是如何表示的。如果它是一个 csv 文件,其中“read. 函数都不会考虑该列数字,除非您强制它如此......然后其中带有“
  • 很抱歉让您如此困惑。我在编辑中上传了一个示例文件。我通过 Rstudio 导入它们没有问题,但是当至少有一个“

标签: r types import


【解决方案1】:

首先我建议在 read.table 或 read.csv 中设置 stringsAsFactors = FALSE

然后对于您要分出的每一列,例如“0.2”并将其替换为您的方程式,然后评估该表达式,例如:eval(parse(text = gsub("&lt;(.*)","\\1/sqrt(2)","&lt;0.2")))

为所有你可以使用 dplyr 的 mutate_at 做这个

library(dplyr)
tdat <- data.frame(Site = letters[1:4], d1 = c(0,0,"<5",4), d2 = c("<0.5",0,7,4), stringsAsFactors = F)

myfun <- function(x){eval(parse(text = gsub("<(.*)","\\1/sqrt(2)",x)))}

tdat <- tdat %>% rowwise() %>% mutate_at(vars(d1:d2), .funs = funs(myfun))

【讨论】:

  • 你为什么使用eval(parse - 为什么不使用普通函数?
  • 我想我想评估一个保存在字符串中的方程,所以 eval(parse 似乎是允许的。你也可以使用 myfun &lt;- function(x){ifelse(is.na(suppressWarnings(as.numeric(x))),as.numeric(gsub("&lt;(.*)","\\1",x))/sqrt(2), as.numeric(x))} 但这对我来说似乎不太整洁,尽管我知道使用 eval(parse 是一般不赞成
猜你喜欢
  • 2020-11-21
  • 2023-04-04
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多