代码之家  ›  专栏  ›  技术社区  ›  maxheld

为什么子集数据帧行“越界”会产生所有NA行?

  •  11
  • maxheld  · 技术社区  · 5 年前

    我相信这是基本的,但我想 理解这里R数据结构的逻辑。

    m <- matrix(data = c("foo", "bar"), nrow = 1)
    m[2,]
    # Error in m[2, ] : subscript out of bounds
    

    如果我也这样做,做一个数据帧,但是,我得到 全部的 NA :

    df <- data.frame(foo = "foo", bar = "bar")
    df[2,]
    #    foo  bar
    # NA <NA> <NA>
    

    如果子集成为不存在的数据帧

    df[, 3]
    # Error in `[.data.frame`(df, , 3) : undefined columns selected
    

    我知道(大致上)数据帧行很奇怪,需要小心处理,但我不太明白与上述行为的关系。

    有人能解释一下吗 为什么? 对于不存在的DF行,R是这样运行的吗?

    当然,给予 在越界子集上,是 正常的 一维向量的R行为:

    vec <- c("foo", "bar")
    vec[3]
    # [1] NA
    

    奇怪的一个 这是 矩阵 子设置,而不是数据帧子设置,这取决于您从哪里开始。 仍然是不同的2D子集行为( m[2, ] df[2, ] )可能会让高密度用户(就像我现在一样)觉得不一致。

    0 回复  |  直到 5 年前
        1
  •  2
  •   Henrik plannapus    5 年前

    有人能解释为什么R会这样做吗?]

    简言之:不,可能不是。


    从前,我在考虑类似的事情,在R-devel上读到了这篇文章: Definition of [[ . 基本上可以归结为:

    [ [[ Reference manual . […]我认为这些是特性,而不是bug,但是我找不到它们的文档

    邓肯·默多克,R核心团队的前成员 reply :

    手册页中有更多的文档 Extract ,但我认为它是不完整的。最完整的文档当然是源代码*,但是 它可能无法回答什么是故意的,什么是偶然的问题

    3.4.1 Indexing by vectors :

    如果 i length(x) 那么相应的选择是 NA

    但是,这适用于“简单向量的索引”。似乎不描述类似的“非简单”向量的越界索引。邓肯·默多克又一次:

    那么什么是简单向量呢?这是没有明确定义的,而且很可能是应该的。

    为什么?


    也见优秀的“82.13下标” R Inferno by Patrick Burns ,以及 Hadley's book


    *的源代码 [ subset operator . 寻找 R_MSG_subs_o_b "subscript out of bounds" [ 矩阵的索引及使用时 给出一个错误,而OOB “简单向量”索引的结果 .