2012-04-25 12 views
4

Rを使用してExcelで行ったモデリングを複製しようとしています。私はcsvファイルのデータをデータフレームに読み込んでいます。 csvファイルには、2つのデータ列ABが含まれています。RデータフレームのExcelのような列操作

私は今、データフレームに追加の列にCDEを追加すると、前の列のデータに数式を適用することで生成されたデータを新しい列C、DとEを移入したいです。

以下のスニペットは、うまくいけば、私が何をしようとしている明確にする必要があります

 A  B  C     D    E 
1 100.5 101.3 
2 102.6 102.5 
3 107.2 109.3 
4 99.3 89.3 
5 102.8 100.7  =(B5-B1)*A5   = C5   = IF(D5 >100,1,-1) 
6 107.2 98.9  =(B6-B2)*A6   = C6+C5  = IF(D6 >100,1,-1) 
7 99.8 109.9  =(B7-B3)*A7   = C7+C6  = IF(D7 >100,1,-1) 
8 108.2 99.5  =(B8-B4)*A8   = C8+C7  = IF(D8 >100,1,-1) 
9 78.7 89.6  =(B9-B5)*A9   = C9+C8  = IF(D9 >100,1,-1) 
10 108.9 109.2  =(B10-B6)*A10  = C10+C9  = IF(D10 >100,1,-1) 

は、どのように私は、この種のを複製することができますエクセルことを「円柱」関数型プログラミング - 中(エヘン優れて) - Rを使用していますか?

+11

C: 'diff'、D:' cumsum'、E: 'ifelse'。 –

+3

@JoshuaUlrichあなたに答えを与えました。あなたの質問から、基本的なRチュートリアルを手にして、Rが "考える"方法を学ぶことをお勧めします。それはExcelよりはるかに強力ですが、別のメゾであります。 –

+0

@ gsk3:それだけの問題です。私は物事を行うためのRのメタファーや「Rウェイ」を説明する/リストする本を見つけることができないようです。私がこれまで見てきたことは、何が行われたかについてのプレゼンテーションに過ぎません。なぜなら、彼らはそのようなやり方(あるいはその背後にある考え方、なぜそのようなアプローチが取られたのか)ではありません。問題を解決するための独特のアプローチを持つ他の言語(Pythonなど)には、推論を説明するドキュメントがあります(PEP標準など)。 AFAIK、Rのようなものはありません。Rで複雑なことをするのは非常に難しいです。あなたはリンクや本をお勧めできますか? –

答えて

9

私の脳は抗議のもとでこれをやっています。私はMinitabセッションに戻ってきたと感じています。

dfrm$C <- NA 
dfrm$C[5:10] <- with(dfrm, (B[5:10]-B[1:6])*A[5:10]) 
dfrm$D <- NA 
dfrm$D[5:10] <- cumsum(dfrm$C[5:10]) 
dfrm$E <- NA 
dfrm$E[5:10] <- 1 - 2*(dfrm$D[5:10] <= 100) # could also use ifelse() 

dfrm 
     A  B  C  D E 
1 100.5 101.3  NA  NA NA 
2 102.6 102.5  NA  NA NA 
3 107.2 109.3  NA  NA NA 
4 99.3 89.3  NA  NA NA 
5 102.8 100.7 -61.68 -61.68 -1 
6 107.2 98.9 -385.92 -447.60 -1 
7 99.8 109.9 59.88 -387.72 -1 
8 108.2 99.5 1103.64 715.92 1 
9 78.7 89.6 -873.57 -157.65 -1 
10 108.9 109.2 1121.67 964.02 1 
+0

「C」のステップは、Joshuaのコメントと一致するようにdiff(B、lag = 5)* A [5:10] 'になります。 +1ミニット! – Justin

+0

同意します。それはより機能的なものになります。 ...少なくとも形式では、しかしあなたはセマンティクスをチェックしましたか? –

+0

@DWin:スニペットありがとう。あなたのコメントと他のいくつかのコメントから判断すると、これを行うための「R中心」の方法があります。これを行うために推奨される(つまり 'R'の方法で)いくつかの行を追加してください。 –

1

私は私の解決策にBondedDustとジャスティンの両方が提供する答えを組み合わせることにより、以下の正しい解決策を作成しました:

A <- c(100.5, 102.6, 107.2, 99.3, 102.8, 107.2, 99.8, 108.2, 78.7, 108.9) 
B <- c(101.3, 102.5, 109.3, 89.3, 100.7, 98.9, 109.9, 99.5, 89.6, 109.2) 
dfexcel <- data.frame(A, B, C = rep_len(NA, 10), D = rep_len(NA, 10), E = rep_len(NA, 10)) 
dfexcel$C[5:10] <- with(dfexcel, diff(B, lag=4)*A[5:10]) 
dfexcel$D[5:10] <- with(dfexcel, (C[5:10]+c(0,C[5:9]))) # cumsum doesn't work for D 
dfexcel$E[5:10] <- ifelse(dfexcel$D[5:10] > 100, 1, -1) 

これは結果であるLibreOfficeのCalcの/ Gnumericに/ Microsoft Excelでの/ etc:

A B C D E 
1 100.5 101.3   
2 102.6 102.5   
3 107.2 09.3    
4 99.3 89.3    
5 102.8 100.7 -61.68 -61.68 -1 
6 107.2 98.9 -385.92 -447.6 -1 
7 99.8 109.9 59.88 -326.04 -1 
8 108.2 99.5 1103.64 1163.52 1 
9 78.7 89.6 -873.57 230.07 1 
10 108.9 109.2 1121.67 248.1 1 
関連する問題