【问题标题】:R: min() function returns not correct answerR: min() 函数返回不正确的答案
【发布时间】:2020-10-04 19:53:18
【问题描述】:

我有一个“a”


[1] “12.5” “12.7” “13.0” “9.6” “9.8” “11.5” “9.5” “11.2” “10.2” “11.1” “9.7”
[12]“9.6”“9.3”“11.0”“13.5”“9.3”“10.6”“9.9”“12.0”“11.3”“12.6”“13.1”
[23] “10.7” “11.2” “9.9” “9.7” “9.2” “14.2” “10.6” “10.8” “10.1” “12.6” “12.7”
[34]“7.4”“12.9”“10.1”“12.9”“11.0”“11.7”“10.6”“8.4”“11.7”“11.0”“10.8”
[45]“12.6”

我的 min(a) 返回 [1] "10.1"

我不明白哪里错了

【问题讨论】:

  • 这些值是字符串吗?
  • 试试min(as.numeric(a))
  • 问题(如果你现在还不清楚)是字符串的字母顺序与对应数字的数字顺序不同
  • 我不认为反对票是合理的。对于任何习惯于难以追溯到数字与字符串表示的程序员来说,问题的根源是足够清楚的,但是对于从统计背景来到 R 的人来说,这种行为在你第一次看到它时会感到困惑。此外(有点令人惊讶)这个问题在 R 标签上并不是明显的重复。我想将其作为重复项关闭,但没有找到匹配项。

标签: r


【解决方案1】:

就像在 cmets 中所说的那样,您的 min() 确实返回了正确答案。但是,这不是您要寻找的答案。您的数据似乎被格式化为 strings,因此它返回编号最小的字母组合。

首先,您需要将数据转换为数字。其中一种方法是使用as.numeric(data),它将您的数据转换为数字类型。如果您不确定您拥有什么样的数据,str() 会告诉您。我希望这会有所帮助!

【讨论】:

    【解决方案2】:

    考虑这个数据框dat

    dat
    #    x.num x.chr x.fac
    # 1    9.1   9.1   9.1
    # 2    9.3   9.3   9.3
    # 3    9.5   9.5   9.5
    # 4    9.7   9.7   9.7
    # 5    9.9   9.9   9.9
    # 6   10.1  10.1  10.1
    # 7   10.3  10.3  10.3
    # 8   10.5  10.5  10.5
    # 9   10.7  10.7  10.7
    # 10  10.9  10.9  10.9
    # 11  11.1  11.1  11.1
    

    这些列看起来很相似,但实际上它们并不相似,这可以通过查看 structure 来发现。

    str(dat)
    # 'data.frame': 21 obs. of  3 variables:
    # $ x.num: num  9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 10 ...
    # $ x.chr: chr  "9.1" "9.2" "9.3" "9.4" ...
    # $ x.fac: Factor w/ 21 levels "9.4","9.9","9.8",..: 16 13 18 1 21 11 8 3 2 6 ...
    

    数字向量(如x.num)的排序发生在数字上,而字符向量(如x.chr)的排序发生在字母上。

    sort(c(10.1, 9.1))
    # [1]  9.1 10.1
    
    sort(c("10.1", "9.1"))
    # [1] "10.1" "9.1" 
    

    minimum 数字向量很简单。

    with(dat, min(x.num))
    # [1] 9.1
    

    要根据其数值获取字符向量的minimum,您可以使用as.numeric

    with(dat, min(x.chr))
    # [1] "10.1"
    with(dat, min(as.numeric(x.chr)))
    # [1] 9.1
    

    第三种类型是需要额外步骤的因子向量。仅as.numeric 将产生因子的最低水平1

    with(dat, min(x.fac))
    # Error in Summary.factor(c(7L, 8L, 9L, 10L, 11L, 1L, 2L, 3L, 4L, 5L, 6L : 
    #                             ‘min’ not meaningful for factors
    with(dat, min(as.numeric(x.fac)))
    # [1] 1
    

    而信息实际上存储在因子levels中。

    with(dat, min(as.numeric(levels(x.fac))[x.fac]))
    # [1] 9.1
    ## or
    with(dat, min(as.numeric(as.character(x.fac))))
    # [1] 9.1
    

    示例数据:

    dat <- structure(list(x.num = c(9.1, 9.3, 9.5, 9.7, 9.9, 10.1, 10.3, 
    10.5, 10.7, 10.9, 11.1), x.chr = c("9.1", "9.3", "9.5", "9.7", 
    "9.9", "10.1", "10.3", "10.5", "10.7", "10.9", "11.1"), x.fac = structure(c(7L, 
    8L, 9L, 10L, 11L, 1L, 2L, 3L, 4L, 5L, 6L), .Label = c("10.1", 
    "10.3", "10.5", "10.7", "10.9", "11.1", "9.1", "9.3", "9.5", 
    "9.7", "9.9"), class = "factor")), row.names = c(NA, -11L), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多