奇怪的大于逻辑与字符向量中的数字
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
【讨论】:
以上是关于奇怪的大于逻辑与字符向量中的数字的主要内容,如果未能解决你的问题,请参考以下文章