9

ベクトルの各偶数要素を 2 で乗算し、ベクトルの各奇数要素を 3 で乗算するとします。これを実行できるコードを次に示します。

v <- 0:10

idx <- v %% 2 == 0
v[idx] <- v[idx] * 2
v[!idx] <- v[!idx] * 3

2 つ以上のケースがあると、これは難しくなります。関数の適用ファミリはベクトルを処理しないように思われるため、この問題を解決するためのより良い方法がわかりません。データに変換を行った場合、適用関数を使用するとうまくいくかもしれませんが、この単純な問題を解決するために必要なことではないようです。

何か案は?

編集:混乱して申し訳ありません。「%%」演算子には特に興味はありません。質問に具体的なコードを入れたかったのですが、質問への回答に基づいて、具体的すぎました。リストの各メンバーに任意の関数を適用する方法を理解したかったのです。これは apply() では不可能であり、sapply() はリストでのみ機能すると考えていました。

4

4 に答える 4

6

できるよ:

v <- v * c(2, 3)[v %% 2 + 1]

任意v %% nの に一般化できます。たとえば、次のとおりです。

v <- v * c(2, 3, 9, 1)[v %% 4 + 1]

length(v)また、 の倍数である必要はありませんn

于 2013-01-08T01:11:31.363 に答える
4

ベクトル乗算を使用して、必要なことを実行できます。

tmp <- 1:10
tmp * rep(c(3,2), length(tmp)/2)

これは、3つ以上のケースに簡単に拡張できます。

tmp * rep(c(3,2,4), length(tmp)/3)
于 2013-01-08T00:33:51.990 に答える
3

最も簡単なのは次のとおりです。

v*c(2,3) # as suggested by flodel in a comment.

ドキュメントで検索する用語は「引数のリサイクル」です...R言語の機能です。二項中置関数に対してのみ機能します (「参考文献」を参照?Ops)。一部の引数でエラーが発生せず、「v」の構造が非常に規則的であることに依存できない非二項ベクトル化関数の場合は、ifelse を使用できます。

ifelse( (1:length(v)) %% 2 == 0, func1(v), func2(v) )

これは 2 つのベクトルを作成し、最初の引数の真理値に基づいて、最初または 2 番目の要素を選択します。投稿のタイトルにある質問に答えようとしている場合は、次を参照してください。

?sapply
于 2013-01-08T01:21:37.650 に答える
2

これは、ベクトル内の定義されたグループに任意の関数のセットを適用できるようにする答えです。

# source data
test <- 1:9
# categorisations of source data
cattest <- rep(1:3,each=3)
#[1] 1 1 1 2 2 2 3 3 3

関数を差別的に適用する関数を作成します。

categ <- function(x,catg) {
          mapply(
                 function(a,b) {
                                switch(b,
                                       a * 2,
                                       a * 3,
                                       a / 2
                                      )
                               },
                  x,
                  catg
                 )
         }
# where cattest = 1, multiply by 2
# where cattest = 2, multiply by 3
# where cattest = 3, divide by 2

結果:

categ(test,cattest)
#[1]  2.0  4.0  6.0 12.0 15.0 18.0  3.5  4.0  4.5
于 2013-01-08T02:02:15.993 に答える