0

私はこのデータフレームを持っています

|    A    |    B    |    C    | Output |
|---------|---------|---------|--------|
| NoFault | NoFault | NoFault |   8    |
|  Fault  | NoFault | NoFault |   2    |
| NoFault |  Fault  | NoFault |   0    |
|  Fault  |  Fault  | NoFault |   2    |
| NoFault | NoFault |  Fault  |   2    |
|  Fault  | NoFault |  Fault  |   0    |
| NoFault |  Fault  |  Fault  |   2    |
|  Fault  |  Fault  |  Fault  |   4    |

次のコードを使用してこれを生成しました。

A <- c(1,0,1,0,1,0,1,0)
B <- c(1,1,0,0,1,1,0,0)
C <- c(1,1,1,1,0,0,0,0)
Output <- c(8,2,0,2,2,0,2,4)
data <- data.frame(cbind(A,B,C,Output))

列 C の出力のパーセンテージを計算する操作を実行したいのですが、結果は次のようになります。

|    A    |    B    |    C    | Output |
|---------|---------|---------|--------|
| NoFault | NoFault | NoFault |8/(8+2) |
|  Fault  | NoFault | NoFault |2/(2+0) |
| NoFault |  Fault  | NoFault |0/(0+2) |
|  Fault  |  Fault  | NoFault |2/(2+4) |
| NoFault | NoFault |  Fault  |2/(2+8) |
|  Fault  | NoFault |  Fault  |0/(0+2) |
| NoFault |  Fault  |  Fault  |2/(2+0) |
|  Fault  |  Fault  |  Fault  |4/(4+2) |

したがって、ここで何が起こっているかというと、列 A、B のシーケンスが繰り返されるたびに、それらの行を取得し、その出力をパーセンテージで作成しています。

例えばA = NoFault​​, B=NoFault, C の出力を分数に変換Fault&ループが避けられるならNoFaultベクトル演算やパッケージで行いたい。plyr

4

1 に答える 1

1

最初に、合計を含む新しい列 (または必要に応じて一時変数) を作成します。次に、それを使用してパーセンテージを取得します。

data$Total <- ave(Output, A, B, FUN=sum)
data$Percent <- data$Output/data$Total
data

##   A B C Output Total   Percent
## 1 1 1 1      8    10 0.8000000
## 2 0 1 1      2     2 1.0000000
## 3 1 0 1      0     2 0.0000000
## 4 0 0 1      2     6 0.3333333
## 5 1 1 0      2    10 0.2000000
## 6 0 1 0      0     2 0.0000000
## 7 1 0 0      2     2 1.0000000
## 8 0 0 0      4     6 0.6666667
于 2013-08-30T12:28:20.743 に答える