5

为什么这不会导致错误?

> 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.frameu中!不应该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
4

2 回答 2

9

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

mail例如 -在 your中没有其他内容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

@mnelfortune(312)指的是:

“这里的问题是 $ 符号是一个神奇的捷径,如果使用不正确,就像任何其他魔法一样,可能会产生相当于把自己变成蟾蜍的程序化效果。”

  • Greg Snow(响应用户希望通过 x$y 而不是 x[[y]] 访问名称存储在 y 中的列的用户)R-help(2012 年 2 月)
于 2013-03-05T05:27:19.707 回答
9
u$mail

调用相当于

u[['mail', exact = FALSE]]

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

u[['mail']]

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

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

 /\_/\
( o o )
== Y ==
 - -
于 2013-03-05T05:50:10.503 回答