为什么 R 找到一个不在 data.frame 中的 data.frame 变量?

2024-01-08

为什么这不会导致错误?

> str(u)
'data.frame':   8879 obs. of  2 variables:
 $ bundle_qty: int  1 1 1 1 1 1 1 1 1 1 ...
 $ mail_a    : num  1 1 1 1 0 0 0 1 1 0 ...

> head(u$mail)
[1] 1 1 1 1 0 0

多变的mail不在 data.frame 中u!!!不应该u$mail return NULL ??

即使我从头开始使用虚拟数据:

> rm(list=ls())
> u <- data.frame( bundle_qty = c(1,1,1,1), mail_a = c(1,1,1,1))
> str(u)
'data.frame':   4 obs. of  2 variables:
 $ bundle_qty: num  1 1 1 1
 $ mail_a    : num  1 1 1 1
> u <- data.frame( bundle_qty = c(1L,1L,1L,1L), mail_a = c(1,1,1,1))
> str(u)
'data.frame':   4 obs. of  2 variables:
 $ bundle_qty: int  1 1 1 1
 $ mail_a    : num  1 1 1 1
> u$mail
[1] 1 1 1 1

部分匹配,其中$运算符使用,如果它可以唯一标识给定词干的变量,则将返回一个值(例如 -mail) 你提供。

例如。 - 没有其他东西开始mail在你的data.frame,所以你得到mail_a回。

u["mail"]但会抛出错误。

举一个进一步的例子来展示它在哪里像你想象的那样工作:

test <- data.frame(aa=1:10,aaa=letters[1:10])

> test$aa
 [1]  1  2  3  4  5  6  7  8  9 10
> test$aaa
 [1] a b c d e f g h i j
Levels: a b c d e f g h i j
> test$a
NULL

And fortune(312)@mnel 指的是:

“这里的问题是 $ 符号是一个神奇的快捷方式,就像 任何其他魔法如果使用不当都可能会导致程序化 相当于把自己变成了一只蟾蜍。”

  • Greg Snow(响应一位想要访问其专栏的用户 名称通过 x$y 而不是 x[[y]] 存储在 y 中) R-帮助(2012 年 2 月)

的一些相关部分R语言定义 https://cran.r-project.org/doc/manuals/r-devel/R-lang.html:

3.4.1 通过向量索引 https://cran.r-project.org/doc/manuals/r-devel/R-lang.html#Indexing-by-vectors

...假设表达式是x[i]。那么根据类型,存在以下可能性i

特点。中的字符串i与名称属性相匹配x并使用所得的整数。为了[[ and $如果精确匹配失败,则使用部分匹配,因此x$aa将匹配x$aabb if x不包含名为的组件"aa" and "aabb"是唯一有前缀的名称"aa". For [[,部分匹配可以通过控制exact参数默认为NA指示允许部分匹配,但发生时应产生警告。环境exact to TRUE防止发生部分匹配,FALSEvalue 允许并且不会发出任何警告。注意[总是需要完全匹配。字符串""被特殊对待:它表示“无名称”并且不匹配任何元素(甚至不匹配那些没有名称的元素)。请注意,部分匹配仅在提取时使用,而在替换时不使用。

[也可以看看?Extract]

4.3.2 参数匹配 https://cran.r-project.org/doc/manuals/r-devel/R-lang.html#Argument-matching

函数求值中发生的第一件事是将形式参数与实际或提供的参数进行匹配。这是通过三遍过程完成的:

  1. 标签精确匹配。对于每个提供的命名参数,都会在形式参数列表中搜索名称完全匹配的项。让同一个形式论证与多个实际参数相匹配是错误的,反之亦然。

  2. 标签部分匹配。使用部分匹配将每个剩余的命名提供的参数与剩余的形式参数进行比较。如果提供的参数名称与形式参数的第一部分完全匹配,则认为这两个参数是匹配的。存在多个部分匹配是错误的。请注意,如果f <- function(fumble, fooey) fbody, then f(f = 1, fo = 2)是非法的,即使第二个实际参数只匹配fooey. f(f = 1, fooey = 2)但这是合法的,因为第二个参数完全匹配,并且从部分匹配的考虑中删除。如果正式参数包含...那么部分匹配仅适用于其前面的参数。

  3. 位置匹配.


请注意,当子集atibble https://tibble.tidyverse.org/reference/subsetting.html

列名部分匹配$ and [[不支持,并且NULL被返回。为了$,给出警告。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 R 找到一个不在 data.frame 中的 data.frame 变量? 的相关文章

随机推荐