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.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
4

2 に答える 2

9

演算子が使用する部分一致は、$指定された語幹(たとえば-)を指定して変数を一意に識別できる場合に値を返し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

そしてfortune(312)、@mnelが参照するのは次のとおりです。

「ここでの問題は、$表記が魔法の近道であり、他の魔法と同じように、間違って使用すると、プログラムで自分をヒキガエルに変えるのと同じことをする可能性が高いことです。」

  • 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']]

部分一致を使用しないため、列が見つかりません。

[[ fortune(312)に記載されているように使用する方が安全です

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