2012-05-11 4 views
2

データフレームを作成しましたが、データフレームの列にアクセスしようとしています。私はこのコードを実行すると、コードが

df <- data.frame(n = c('A','B','C'), 
       mark_1 = c(23,25, 17), 
       mark_2 = c(45,46,50)) 

j <- paste('mark',1,sep="_") 
j 

f <- '$'(df,j) 
summary(f) 

n <- '$'(df,"mark_1") 
summary(n) 

の下に示されているように、これは私が

> j <- paste('mark',1,sep="_") 
    > j 
    [1] "mark_1" 
    > f <- '$'(df,j) 
    > summary(f) 
    Length Class Mode 
     0 NULL NULL 
    > n <- '$'(df,"mark_1") 
    > summary(n) 
     Min. 1st Qu. Median Mean 3rd Qu. Max. 
     17.00 20.00 23.00 21.67 24.00 25.00 
    > 

何を得るのはなぜ要約(f)が動作していないのですか? jは "mark_1"に正しく連結されています。それでは、なぜエラーが発生していますか? $オーバー

+0

'df [、j]'のようにインデックスを使用しないのはなぜですか? –

+0

上記と同じ質問を続けると、関連する2つの質問があります。mark_1、mark_2、mark_100という名前の100個の変数がある場合、(i in 1:100){ f < - paste 2番目の質問は、mark_6列が欠落している場合、mark_7をmark_100に処理せずにi = 5の後にforループが出てくることです。この問題をどうやって乗り越えるのですか?おかげで – wenge

答えて

5

使用のインデックスのように事前に

ありがとう:

df[, j] 
summary(df[, j]) 
+0

ありがとうタイラー - これは – wenge

6

@TylerRinkerではなく、何をすべきかを示しました。

...しかし、'$'(df,j)を使用できない理由は、ドル演算子が第2引数を文字通り使用するからです。

... so '$'(df,mark_1)は正常に動作します。しかし、変数を渡すことはできません。 - それは、引数の名前を見て、 むしろその値よりも

df[,j] # The j'th column 
df[[j]] # Pretend df is a list of columns and get the j'th element 
+0

良い説明です。私は早期に(おそらくR Infernoから) '$'の人より索引を使うことを覚えました。なぜなら、驚きが少ないからです。 –

4

'$'(df,j)df$jと同等です:それは[[[はのためにあるものです。 df[[j]]またはdf[,j]または'[['(df,j)の代わりに を使用できます(ただし、コードを読みにくくしない限り、最後の文字は使用しないでください)。

df$j <- 1 

# The "j" column 
df$j 
`$`(df,j) 
`[[`(df,"j") 
df[["j"]] 
df[,"j"] 

# The "mark_1" column 
df[[j]] 
df[,j] 
`[[`(df,j) 
2

do.callで適用した場合は、「$」を使用できます。 do.callは、関数の名前が言語の値ではなく文字である場合に便利です。この場合、第2引数、データフレームとカラム名のリストも評価されます。言っ

do.call('$', list(df, j)) 
[1] 23 25 17 

は、私はあなたが当然のように、第2引数の評価を行う「[[」または「[」を使用したほうが良いと思います。