【问题标题】:converting numerical values into decimal numbers将数值转换为十进制数
【发布时间】:2012-02-28 12:16:30
【问题描述】:

我有一个文本文件,其中的值有一个或两个或一些小数点后 3 个。这些值是由软件根据基因的信号强度生成的。当我试图从中计算距离矩阵时,我得到了警告信息:

警告信息: 在 dist(sam) :强制引入的 NA 下面给出了一个示例文本文件: 样品1
23.45.12
b 123.345.234
c 45.2311.34

我需要将这些值转换为小数点后一位或实数,以便我可以从中计算距离矩阵,然后我可以将其用于聚类。我的预期结果如下:

  sample1                

23.45
b 123.345
c 45.2311

请帮帮我

【问题讨论】:

  • 你的意思是“。”是分隔三个值的值吗?如果不是,“23.45.12”代表什么数字?
  • 但是里面有两位小数。
  • @Thileepan 有两位小数的数字不是数字,至少在西方世界,更重要的是,就 R 而言。那么,您的“两位小数”值在实数世界中指的是什么?
  • @Thileepan R 不在乎这些数字是否对您有任何意义,它期望有一个小数位的数字,否则这些不是根据 R 的数字。现在您告诉我们如何转换这些数值转换为十进制数,否则我将投票关闭此 Q,因为您很迟钝,没有听我们告诉您的内容,并且没有转换,就没有没有方法来回答您的问题问题。
  • 如果你只想去掉最后一个小数点和后面的任何东西,试试strsplt() . 并把前两个部分粘在一起。 splt <- strsplit(vector, "\\."),其中vector 是您的字符串列。然后做sapply(splt, function(x) as.numeric(paste(x[1], ".", x[2], sep = "")))。例如。 splt <- strsplit("23.45.12", "\\."),然后sapply(splt, function(x) as.numeric(paste(x[1], ".", x[2], sep = ""))) 给出[1] 23.45,这是数字。没有四舍五入,只是截断。

标签: r matrix distance


【解决方案1】:

您可以在一行代码中使用as.numericgsub 并使用合适的正则表达式:

sample1 <- c(
  a = "23.45.12",
  b = "123.345.234",
  c = "45.2311.34"
)

as.numeric(
  gsub("(\\d+\\.\\d+)\\..*", "\\1", sample1)
)

[1]  23.4500 123.3450  45.2311

正则表达式:

  • \\d* 找到一位或多位数字
  • \\. 找到句号
  • 因此(\\d+\\.\\d+) 找到了两组数字,中间有句点,然后将其分组(用括号)
  • 最后,\\..* 找到一个句点后跟一个完整的通配符

然后gsub 将整个字符串替换为仅在括号内找到的内容。这称为正则表达式反向引用,由\\1 表示。

【讨论】:

  • 我尝试使用 dist 函数获取距离矩阵,但矩阵仅填充了 NA。如果你喜欢我可以邮寄给你我想创建一个距离矩阵的文本文件
  • @Thileepan 我建议您阅读stackoverflow.com/questions/5963269/…,了解如何在发布问题时提供所有相关数据。如果您仍然卡住,那可能是因为您没有向我们提供正确的信息。但是,无论如何,给我发电子邮件。您会发现我收取非常合理的商业支持费率。
猜你喜欢
  • 2013-05-31
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
相关资源
最近更新 更多