【问题标题】: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))

标签: r logic character


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2021-01-13
      • 2013-06-20
      • 2017-05-23
      • 1970-01-01
      相关资源
      最近更新 更多