2013-03-05 141 views
4

爲什麼這不會導致錯誤?爲什麼R找到不在data.frame中的data.frame變量?

> 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 uu$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 
+0

@thelatemail應該是一個答案。記得包括財富(312) – mnel 2013-03-05 05:24:47

+0

這很快。不知道部分匹配。聽起來像是一件危險的事情,不知道:非常感謝。我如何選擇你的答案? – user2105469 2013-03-05 05:25:41

+0

@ user2105469 - 我已將它翻譯爲答案。 – thelatemail 2013-03-05 05:27:39

回答

8

部分匹配,其中$運營商使用,會返回一個值,如果它可以唯一地標識給定幹一個變量(例如 - mail)你提供。

E.g. - 您的data.frame中沒有其他以mail開頭的內容,因此您將返回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 

而且fortune(312)是@mnel指的是:

「這裏的問題是,$符號是一個神奇的捷徑,並且如果使用不正確的話,任何其他魔法都可能會使程序化的 等同於將自己變成蟾蜍。

  • 格雷格·斯諾(根據這一想訪問其 名通過X $ Y存儲在y中,而不是X [[Y]列的用戶) R-幫助(2012年2月)
+3

可能會提到'u [['mail']]''和'u [['mail',exact = FALSE']]'(後者是'u $ mail'調用) – mnel 2013-03-05 05:29:56

+1

(-1)沒有足夠的貓的照片 – Dason 2013-03-05 05:32:38

+0

@mnel - 寫作作爲額外的答案,我可以爲您提供一個閃亮的+1(雖然沒有貓圖片,對不起)。 – thelatemail 2013-03-05 05:37:26

8
u$mail 

呼喚的

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

相當於它將使用部分匹配找到一個amed元素(列)

u[['mail']] 

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

它是使用更安全[[如在運氣(312)注意

/\_/\ 
(o o) 
== Y == 
- - 
+2

(+1)對於貓 – Dason 2013-03-05 05:57:06

+2

ASCII藝術很難在手機上! – mnel 2013-03-05 05:59:57

+1

+1!最好的** CATY **解決方案直到現在:) – agstudy 2013-03-05 06:02:01