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

use*_*469 4 r

为什么这不会导致错误?

> 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
Run Code Online (Sandbox Code Playgroud)

变量mail不在data.frame中u!不应该u$mail回来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
Run Code Online (Sandbox Code Playgroud)

the*_*ail 8

$运算符使用的部分匹配将返回一个值,如果它可以唯一地标识给定词干(例如 - 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
Run Code Online (Sandbox Code Playgroud)

fortune(312)这@mnel指的是:

"这里的问题是,$符号是一个神奇的捷径,就像任何其他魔法一样,如果使用不当可能会使程序化等同于将自己变成蟾蜍."

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

  • 提及`u [['mail']]`和`u [['mail',exact = FALSE`]]`(后者是`u $ mail`调用)可能会更好 (3认同)

mne*_*nel 8

u$mail
Run Code Online (Sandbox Code Playgroud)

正在呼唤相当于

u[['mail', exact = FALSE]]
Run Code Online (Sandbox Code Playgroud)

它将使用部分匹配来查找命名元素(列)

u[['mail']]
Run Code Online (Sandbox Code Playgroud)

不会使用部分匹配,因此不会找到任何列.

[[ 如财富(312)所述,使用更安全

 /\_/\
( o o )
== Y ==
 - -
Run Code Online (Sandbox Code Playgroud)

  • (+1)对于猫 (2认同)
  • 移动设备上的ASCII艺术很难! (2认同)