2017-09-11 2 views
1

私は異なる株価指数に属する一連の会社を持っています。私はインデックスの名前に基づいて、異なるサブセットを作成したいと思います。ここでなぜこの機能はサプリではなく適用で機能しますか?

は再現例です。

cs.ind.sp500 <- c(1,1,1,0,0,0,0,0,0,0) 
cs.ind.spsc1500 <- c(0,0,1,0,0,0,0,0,0,0) 
cs.ind.dax40 <- c(0,0,0,0,0,0,0,1,1,1) 
dat <- data.frame(cs.ind.sp500, cs.ind.spsc1500, cs.ind.dax40) 

私は今、次の簡単な関数を書かれています。それは私が下記のように、ベクトルの異なるセットにこの機能を適用したい別の行を通過し、インデックスのメンバーのためにスタンドダミー、の少なくとも一方が、1

fun<- function(x) { 
    if (any(x == 1)) { 
    1 
    } else { 
    0 
    } 
} 

に等しいかどうかを確認する必要があります。

dat$sel.compall <- sapply(X = dat[grepl("^cs.ind.", names(dat))], FUN = fun) 

dat$sel.compbase <- sapply(X = dat[grepl("^cs.ind.", names(dat)) & !grepl("^cs.ind.spsc1500", names(dat))], FUN = fun) 

しかし、何が起こるかは以下の通りです:

Error in `$<-.data.frame`(`*tmp*`, sel.compall, value = c(1, 1, 1)) : 
    replacement has 3 rows, data has 10 

最初の呼び出しでエラーが発生します

2番目の呼び出しは、条件がすべての行に対して保持されていなくても、すべての行に1を割り当てます。

私はapply、などを介して適用されます

...

dat$sel.compbase <- apply(X = dat[grepl("^cs.ind.", names(dat)) & !grepl("^cs.ind.spsc1500", names(dat))], FUN = fun, MARGIN = 1) 

は...動作しているようです。

ここでsapplyを使用できないのはなぜですか?この場合、sapplyが出力を簡素化できない理由はありません。

答えて

1

sapply functionあなたのFUNを列に適用します。列のapplyに設定するには、MARGIN = 2

行または列に適用したいですか?

+0

こんにちは!私は、これらの列の値の少なくとも1つ(いずれか)が1であるかどうかをインデックス化された列の各行を調べる関数にしたいと思います。これは行単位で適用することを意味します。 – deca

+0

それではsapplyを使用することはできません(サプリーを使用している間、あなたのdata.frameは列のリストと見なされます) –

+0

この場合、MARGIN = 1でapplyを使用するのが最善でしょうか? また、関数を直接呼び出すと1だけしか得られないのですか? (例: 'dat $ sel.compbase <-fun(x = dat [grepl("^cs.ind。 "、names(dat))])' – deca

関連する問題