奇怪的大于逻辑与字符向量中的数字

Posted

技术标签:

【中文标题】奇怪的大于逻辑与字符向量中的数字【英文标题】:Strange Greater Than Logic with Numbers in Character Vector 【发布时间】:2022-01-13 06:32:25 【问题描述】:

我今天正在编写一个脚本,并注意到一些非常意外的输出。经过检查,我发现我的数据集中的一个变量,应该始终是数字,具有一个字符值(本质上是一个带有键入“N/A”的单元格,而不是一个正确读取为 NA 的值)。这不是一个真正的问题,因为我可以手动将此值重新编码为 NA。我很好奇的是为什么我在索引这个向量时没有收到错误,以及如何解释输出。下面提供了一个示例:

c("56.2", "84.7", "63", "9", "109.5", "16", "N/A", "50") >= 50

输出结果:

TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE

条目被标记为 TRUE 或 FALSE 背后的逻辑对我来说并不是很明显。谁能解释一下?

【问题讨论】:

学习help("Comparison")。它回答了你的问题。 支持你收到的答案,从 R 的角度来看,执行sort(c("56.2", "84.7", "63", "9", "109.5", "16", "N/A", "50", 50)) 【参考方案1】:

Merjin van Tilborg 解释的补充说明:

x <- c("56.2", "84.7", "63", "9", "109.5", "16", "N/A", "50") 
x >= 50

# gives
[1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE

# Now check which indexes fulfill this comparison (the why is explained by Merjin van Tilborg)
which(x >= 50)
[1] 1 2 3 4 7 8

# if you do like this:
as.numeric(x) >=50

# you get:
[1]  TRUE  TRUE  TRUE FALSE  TRUE FALSE    NA  TRUE
Warning message:
  NAs introduced by coercion

【讨论】:

【参考方案2】:

因为字符比较是按字母顺序进行的,并且数字在字母之前,所以“100.9”以 1 开头,因此在“50”中比 5 排在前面,因此“更小”/更早。

"ab" > "b"
# a comes before b
# [1] FALSE

"12" > "2"
# 1 comes before 2 as character
# [1] FALSE

【讨论】:

以上是关于奇怪的大于逻辑与字符向量中的数字的主要内容,如果未能解决你的问题,请参考以下文章

向量和Ifelse逻辑 - 不会填充向量

使用逻辑 OR 组合列表中的逻辑向量

R语言实战之创建数据集

线性支持向量机:一个名字奇怪但思想简单的算法

matlab学习3

MatLab数据结构