Rの初心者として、私は(私のために、少なくとも、それが複雑になっている)、複雑なコードを読んで苦労されています。私は単純なコードを読んだとき、構造が非常に明確です。私は、変数と、ちょうどそのような何か他の引数、である伝えることができます。お気に入り:
x <- c(1, 2, 3)
私はいくつかの複雑なコードを読んだときしかし、私は混乱します。例えば:
output <- vector("double", ncol(df))
for (i in seq_along(df)) {
output[[i]] <- median(df[[i]])
}
output
それはseq_along前(DF)ではない他の(Iの使用?seq_alongが、応答がない)「の」だ、なぜ私は知りません。「(seq_along(DF)i)において、」中括弧でない理由を私は知りません。それが条件ですか?私はどこに置くことができるか伝えることができ、それを通してプログラミング言語の基本的なロジックがあれば?Rで複雑なコードを読み取るためにどのように従うことができます任意のロジックがある場合、私は意味ですか?
基本的な構造for()
Rでの関数であります:
for(condition that iterates) {
# do something
}
中括弧演算子{
と}
前の関数で起こったものは何でも取るfor()
と中括弧内のプログラミング・ステートメントに適用します。
[[
あなたの質問の中には、4つの形式のいずれかである抽出演算子。[[
具体的に計算されたインデックスをサポートしながら一つはリストから1つの要素を抽出することを可能にします。私は、私の記事で抽出演算子の形の3の例示を提供する抽出演算子のフォームを。第四の形態、@
(また、スロット演算子として知られている)はR S4で対象システムで構築されたオブジェクトに固有であり、典型的にはRプログラマを開始することによって使用されません。
遠くRコードを読み取る方法を学ぶほど、私はコメントで掲示参照は、Rプログラミングあなたはそれのために$ 0支払うことを決めることができるので、ロジャー鵬によっては、合理的な「自由」のリソースです。
オリジナルのポスト内のコードの説明
ここでは、元の例を歩くと何が起こっているかを説明します。以来df
、オリジナルのポストで未定義た、我々は使いますmtcars
データフレームを。
df <- mtcars
# instantiate a vector object with length equal to number of columns in
# df, which in this example should be 11
output <- vector("double",ncol(df))
length(output)
> length(output)
[1] 11
>
この時点での列の数と一致する長さ11を有する出力ベクトルを定義していますdf
。
次に、for()
関数は、の値セットi
内の列の数に1からの固有のシーケンシャル番号にしますdf
。
我々は結果を印刷することで、これを見ることができますseq_along()
。
# illustrate what seq_along() does
seq_along(df)
> seq_along(df)
[1] 1 2 3 4 5 6 7 8 9 10 11
>
各値に対してi
、その中の関連する列の中央値を算出df
し、内の対応する要素に保存しますoutput
。
# iterate across columns in df, from 1:11
for (i in seq_along(df)){
output[[i]] <- median(df[[i]])
}
Rは、ベクトルの要素に名前の割り当てをサポートしています。中に何が起こったのか、それは明らかにするためにfor()
ループ、我々は内の要素の名前を設定しますoutput
の列名にdf
、ベクトルを印刷します。
# add names to output vector and print
names(output) <- colnames(df)
output
> output
mpg cyl disp hp drat wt qsec vs am gear carb
19.200 6.000 196.300 123.000 3.695 3.325 17.710 0.000 0.000 4.000 2.000
>
重要性[[
抽出演算子
この時点で始まるRのユーザーは、「なぜ、このコードは使用しない、頼むかもしれない[[
代わりの抽出演算子の形を[
?」
キーは、元の質問のコードのために、ということである[
フォームタイプのオブジェクトを返しdata.frame()
、一方、[[
評価したデータフレーム及び数値ベクトルを返します。我々は、でこれを示すことができるstr()
Rオブジェクトの構造を返す関数、。
str(df[1]) # returns a data frame
str(df[[1]]) # returns a numeric vector
> str(df[1]) # returns a data frame
'data.frame': 32 obs. of 1 variable:
$ mpg: num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
> str(df[[1]]) # returns a numeric vector
num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
>
median()
この関数は、入力として数値ベクトルを期待しています。それに代わり、ベクトルのデータフレームを渡すと、「必要性、数値データ」エラーが発生します。
> median(df[1])
Error in median.default(df[1]) : need numeric data
>
Rは、このような状況で何をしているかを説明するもう一つの方法は、ということであるdf[1]
サブセットデータフレームは、単一の列を持つデータフレームを返すために、一方でdf[[1]]
単一の列にデータフレームをサブセットだけでなく、再帰的に値を返すようにサブセットだけでなく、ベクターとして最初の列。以上の2列をサブセット化することにより、我々は、再帰的なサブセットが失敗する可能性があります。
# illustrate recursive subsetting with a case that will fail
head(df[1:3]) # print 6 rows of first 3 columns
head(df[[1:3]]) # fails with recursive subset error
> head(df[1:3]) # print 6 rows of first 3 columns
mpg cyl disp
Mazda RX4 21.0 6 160
Mazda RX4 Wag 21.0 6 160
Datsun 710 22.8 4 108
Hornet 4 Drive 21.4 6 258
Hornet Sportabout 18.7 8 360
Valiant 18.1 6 225
> head(df[[1:3]]) # fails with recursive subset error
Error in .subset2(x, i, exact = exact) :
recursive indexing failed at level 2
>
Rでの問題を解決するために多くの方法
元の質問にコードを説明した、それは我々がのバージョンを使用しますR.で何かをする多くの方法がここにあることに注意することが重要ですfor()
内の列名に基づいて、その繰り返し処理をdf
し、使用して[[
抽出する抽出演算子の形を正しい列には、df
その中央値を計算します。
# now illustrate same code by iterating over column names
output2 <- vector("double",ncol(df))
names(output2) <- colnames(df)
columnNames <- colnames(df)
for (i in columnNames){
output2[[i]] <- median(df[[i]])
}
output2
> output2
mpg cyl disp hp drat wt qsec vs am gear carb
19.200 6.000 196.300 123.000 3.695 3.325 17.710 0.000 0.000 4.000 2.000
>
この溶液中の重要な微妙な要素に名前を割り当てることにすることであるoutput2
我々は、インデックスへの出力ベクトル、ならびに入力データフレーム名を使用することができます。私たちは名前が割り当てられていなかった場合は実際には、ループがベクトルの要素午前12時22分で、名前付きの値を付加し、不正確な結果を生じるであろう。
最後に、あなたがRの学習に進むにつれて、あなたは学びますapply()
1を避けるためにできる関数の家族、for()
ループを。使用して、同じ問題の解決lapply()
「のリストが適用」または次のコードブロックを例示しています。コードブロックは、実装匿名関数それは名前が与えられていないことを除いて、他のR関数のようなものです。以来lapply()
戻りリストと我々が使用し、リストの各項目は、単一の番号であることを知っているunlist()
から返されたリストに変換するために、lapply()
ベクターにします。
# produce same output with a different technique: lapply()
columnNames <- colnames(df)
output3 <- unlist(lapply(columnNames,function(x){
median(df[[x]])
}))
names(output3) <- colnames(df)
output3
> output3
mpg cyl disp hp drat wt qsec vs am gear carb
19.200 6.000 196.300 123.000 3.695 3.325 17.710 0.000 0.000 4.000 2.000
>