6

プログラマー向けのRを読んで、この関数を見ました

oddcount <- function(x) {
  k <- 0
  for (n in x) {
    if (n %% 2 == 1) k <- k+1
  }
  return(k)
}

私はそれをより単純なスタイルで(つまりLispで)書きたいと思います

(defn odd-count [xs]
  (count (filter odd? xs)))

関数の長さが count と同等であることがわかりましたが、奇数と書くことができますか? 組み込みのマップ/フィルター/削除タイプの関数はありますか?

4

3 に答える 3

12

R では、ベクターを操作する場合、ベクター全体をループ処理するよりも、ベクター全体を一度に処理することを好むことがよくあります (たとえば、このディスカッションを参照してください)。

ある意味では、R には "組み込み" のフィルター機能とリデュース機能 (ベクトルのサブセットを選択できる方法) があります。それらは R で非常に便利で、いくつかの方法があります。いくつか紹介しますが、R について読んだり、このようなサイトで他の人のコードを見たりすると、さらに多くのことを理解できるでしょう。?whichまた、とも参照することを検討?'['します。これには、ここで説明するよりも多くの例があります。

最初の方法は、必要な要素を選択するだけです。必要な要素のインデックスがわかっている場合は、これを使用できます。

x <- letters[1:10]
> x
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

最初の 5 文字だけが必要な場合は、次のように記述できます。

x[1:5]
x[c(1,2,3,4,5)] # a more explicit version of the above

マイナス記号を使用して、不要な要素を選択することもできます。次に例を示します

 x[-(6:10)]

要素を選択する別の方法は、ブール値ベクトルを使用することです。

x <- 1:5
selection <- c(FALSE, TRUE, FALSE, TRUE, FALSE)
x[selection]   # only the second and fourth elements will remain

ベクトルを比較関数に入れることでそのようなベクトルを作成できるため、これは重要です。

selection <- (x > 3)
> selection
 [1] FALSE FALSE FALSE  TRUE  TRUE

x[selection]   # select all elements of x greater than 3
x[x > 3]       # a shorthand version of the above

ここでも、使用する比較の反対を選択できます (これはブール値であるため、 を使用!せず、 を使用することに注意してください-)。

x[!(x > 3)]    # select all elements less than or equal to 3

ベクトル比較を行いたい場合は、%in%関数を検討する必要があります。例えば:

x <- letters[1:10]
> x %in% c("d", "p", "e", "f", "y")
 [1] FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE

# Select all elements of x that are also "d", "p", "e", "f", or "y"
x[x %in% c("d", "p", "e", "f", "y")]  
# And to select everything not in that vector:
x[!(x %in% c("d", "p", "e", "f", "y"))]  

上記はほんの一例です。私は間違いなくドキュメントをお勧めします。これは、すでに回答を受け入れた後の長い投稿であることは承知していますが、この種のことは非常に重要であり、理解することで、R を初めて使用する場合、将来的に多くの時間と労力を節約できるので、私は考えました私はあなたとそれを行ういくつかの方法を共有したいと思います.

于 2012-07-31T12:21:57.183 に答える
11

これを行うためのより R な方法は、forループを回避し、ベクトル化を使用することです。

oddcount <- function(x) {
  sum(x %% 2)
}

と 2の比較は、それ自体がxベクトルであるため、ベクトルを出力します。Sum than は、 1 と0xに等しいベクトルの合計を計算します。このようにして、関数はベクトル内の奇数の数を計算します。TRUEFALSE

これはすでにより単純な構文につながりますが、ベクトル化を指向していない人にとっては、forループは読みやすい傾向があります。ベクトル化された構文の方がはるかに短いため、私は非常に気に入っています。xただし、よりわかりやすい名前を使用することをお勧めしますnumber_vector

于 2012-07-31T11:37:31.697 に答える
5

、などを含むfunprogライブラリを確認する必要があります。mapfilterreduce

于 2012-07-31T11:23:04.577 に答える