2012-01-31 11 views
1

でmutiplicationコード(data.frame以内)私は誰かが私に使用するための提案を与えることができるR.における乗算と加算のシリーズを行うには、このコードを持っている*それすっきりと短くする適用されますか?短縮ベクトルはR

私は、このような「シリーズ」、「乗算」などのキーワードで周りを見回したが、どこにも取得できませんでした。この質問が以前に投稿されている場合は、私にそのリンクを教えてください。ありがとうございました。

df1nは> 78個の変数と215の観察とdata.frameあります。

dff[,3]<-(df1n[5]*((df1n[25]*df1n[26]*df1n[27]) + (df1n[28]*df1n[29]*df1n[30]) + 
     (df1n[31]*df1n[32]*df1n[33]) + (df1n[34]*df1n[35]*df1n[36]) + 
     (df1n[37]*df1n[38]*df1n[39]) + (df1n[40]*df1n[41]*df1n[42]) + 
     (df1n[61]*df1n[62]*df1n[63]) + (df1n[64]*df1n[65]*df1n[66]) + 
     (df1n[67]*df1n[68]*df1n[69]) + (df1n[70]*df1n[71]*df1n[72]) + 
     (df1n[73]*df1n[74]*df1n[75]) + (df1n[76]*df1n[77]*df1n[78])) 
     ) 

よろしく、私は(A*B*C)作品ごとにインデックスのリストを構築するためにlapply()を使用したい

+0

配列インデックスへの任意のロジックはありますか?あなたは何をしようとしていますか? – Moe

+0

こんにちは、これは、data.frameの他の値に基づいて値を計算する公式です。私が考えることができる唯一の論理は、25で始まり次の3列の乗算を行い、次に3列の次の乗算に40まで加えます。次に61を見て再び同じパターンをclumn 76まで繰り返します。これがはっきりしていることを希望私はこれが配列の索引付けと呼ばれていることを知らなかった。ありがとうございました。 – ikel

答えて

3

ikel。次に、これらのインデックスをsapplyに渡し、各要素のセットをdf1nから抽出し、それらにprod()を掛けます。

df1n <- 1:100 
ll <- lapply(c(seq(25, 40, by=3), seq(61, 76, by=3)), 
      function(X) seq(X, by=1, length.out=3)) 
df1n[5] * sum(sapply(ll, function(i) prod(df1n[i]))) 
# [1] 11439180 

EDIT:残りは自明である今、私はdf1nの各要素は長さ215のベクトルであることを知っていることを、ここにコードだ私の代わりにお勧めしたい:

# Example data (a list in which each element is a vector of length 215). 
x <- replicate(100, 1:215, simplify=FALSE) 
ll <- lapply(seq(25, 76, by=3), function(X) seq(X, by=1, length.out=3)) 
res <- x[[5]] * rowSums(sapply(ll, function(i) Reduce("*", x[i]))) 

str(res) 
# num [1:215] 18 288 1458 4608 11250 ... 
+0

こんにちはジョシュ、それは短い〜です!私はそれを試してみると – ikel

+0

@ikel〜あなたはすぐにお知らせします - 私はあなたが25から76に全体のシーケンスを使用していなかったことを見逃していた、それは正しい計算をするように、私は今それを編集しました。私の最善のアドバイスは、作品の仕方を見るために作品をちょうど回って遊ぶことです。これがうまくいく場合は、その左側のチェックマークをクリックして回答を受け入れることができます。がんばろう! –

+0

実際には、私のdf1 [5]と他は、それぞれ215の観測値を持ち、式を適用すると(carefuly)NAを出力します。もう一度やり直してお知らせします。私は「プロードド」が使うべき正しい機能だとは思わない。 – ikel

2

ここでは、以下のサンプルデータの元のコードと同じ出力に含まを生成ジョシュのソリューションの変更があります。

# Some sample data 
df1n <- as.data.frame(lapply(1:80, function(i) seq(i, len=5))) 

df1n[5] * rowSums(sapply(c(seq(25,40,3), seq(61,76,3)), 
    function(i) df1n[[i]]*df1n[[i+1]]*df1n[[i+2]])) 
# c.5..6..7..8..9. 
#1   11439180 
#2   14386680 
#3   17580528 
#4   21032640 
#5   24755220 
+0

+ +1のコードよりも難読化されていないコードの方が+1です。それでも、私がそれを得ると、私は決してReduce()を使用する機会を逃しているように見えるかもしれません... –

+0

@Tommy - ありがとうございます< - function(i)df1n [[i]] * df1n [[i +1]] * df1n [[i + 2]] ...人間が読める^ _ ^ – ikel